python module and package

Mun Lee·2020년 6월 27일
0

1.Sys.module와 Sys.path의 차이점

파이썬에서 모듈/package를 찾는 우선순위는
1.sys.modules -> 2.built-in modules -> 3.sys.path이다.

1.sys.modules : 파이썬에서 모듈이나 패키지를 찾기위해 가장 먼저 확인하는 곳이다. dictionary이고 이미 import된 모듈과 패키지들을 저장하고 있다.한번 import되면은 다시 찾지 않아도 되는 기능을 가지고 있다. 따라서 새로 import하는 모듈은 sys.modules에서 못찾음.

2.sys.path : 기본적으로 list이고 string 요소돌을 가지고 있다.
'/Users/safasf/andfjdfjknda3/bin', 파이썬은 list의 각 경로를 하나 하나 확인하면서 해당 경로에 import 하고자 하는 패키지가 위치해 있는지 확인한다.

3.built-in modules: 파이썬에서 제공하는 공식 라이브러리들이 여기에 모여있다.

2. sys 도 import 해야하는 모듈입니다. 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을까요?

'sys': <module 'sys' (built-in)>
sys모듈은 built_in 모듈에서 찾을수 있다.

3. Absolute path와 relative path의 차이점을 서술해 주세요.


이러한 패키지를 만들어보기로 했다.
Absolute path는 절대경로이고 ,import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하다.
Absolute path -> 절대경로이고 , 최상단 디렉터리를 기준으로 경로를 설정 import하는 파일이나 경로에 상관없이 늘 똑같다. local 패키지를 import할때는 절대경로를 사용한다.

from <모듈path1>.<모듈path2> import <변수 / 함수 / 클래스 >

Relative path -> 현재 프로젝트의 실행디렉토를 기준으로 경로를 설정

from .<모듈path1>.<모듈path2> import <변수 / 함수 / 클래스>

4. calculator 패키지 만들기

5.상대경로로 import 하면 안되는 이유(절대경로로 하라는 뜻)

6.상대경로 절대경로 결과

from .calculator.add_and_multiply import add_and_multiply
(이건 상대경로)

File "/Users/munyeonglee/Desktop/main.py", line 1, in <module>
    from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package

상대경로로 만들었을때 이와같은 에러가 발생했다.
이유를 알아보고자 파이썬 공식문서를 찾아보았는데

Note that relative imports are based on the name of the current module. Since the name of the main module is always "main", modules intended for use as the main module of a Python application must always use absolute imports.
이렇다고 한다. 상대경로는 현재 모듈의 이름을 베이스로 하기때문에 우리가 사용하기 위한 메인모듈은 항상 절대경로로 설정해서 해야한다고 한다.

from calculator.add_and_multiply import add_and_multiply
절대경로로 하였을때는 아무런 문제 없이 원하는 결과를 얻을수 있다.

(base) munyeonglee@munyeongui-MacBookPro ~ % /Library/Frameworks/Python.framework/Versions/3.8/bin/python3 /Users/munyeonglee/Desktop/main.py
5

7. init.py의 역활에 대해서

init은 해당하는 패키지가 import되었을때, 여기에 해당하는 코드들은 자동으로 실행되게 된다. 그래서 init initail의 이름을 딴것이다.

객체를 초기화할때 쓴다고 보면 된다.

class Car:
	def __init__(self,company):
    	self.company = company
        print(company + "회사에 입사에 합격하신것을 축하합니다.)

Car("삼성") 을 하면
삼성에 입사에 합격하신것을 축하합니다가 결과로 나오게 된다.

profile
개발자가 되고자 하는 30살

0개의 댓글