[TIL] Python Package

dustjd1535·2020년 8월 24일
0

1. calculator package 만들기

2. main.py 실행 시 상대 경로로 지정할시 오류가 발생하는 이유는 무엇이고 main.module 에서는 패키지 모듈을 어떻게 import 해야할까?

from .calculator.add_and_multiply import add_and_multiply
>>Exception has occurred: ImportError

main.py에서 상대경로로 add_and_multiply를 import 하면 ImportError가 발생한다.
파이썬 공식문서에는

"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." 

main module 일 경우에는 import를 절대 경로로 해야 된다는 뜻이다. 상대경로는 현재 모듈을 기준으로 module/package를 찾기 때문에, 이름이 main module이면 항상 메인이라서 반드시 절대경로를 사용해야 한다.

3. add_and_multiply.py에서 multiply함수를 절대경로와 상대경로로 각각 import 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보기

3-1. multiply함수를 절대 경로로 import 할 경우,

from claculator.multiplication import multiply
>>ModuleNotFoundError: No module named 'calculator'

위와 같은 오류가 발생한다. current directory 라고 하는 현재의, 프로젝트 디렉토리는 default로 sys.path에 포함되게 된다. 그러므로 절대 경로는 current directory로 부터 경로를 시작해야 한다.

3-2. multyply함수를 상대경로 import 할 경우,

from .multiplication import multiply
ImportError: attempted relative import with no known parent package

위와 같은 오류가 발생한다. add_and_multiply.py와 multiplication.py는 같은 디렉토리에 있기 때문에 상대경로 from .multiplication import multiply 대신에 from mulriplication import multiply을 사용하면 오류가 뜨지 않는다.

4._ init_.py 파일의 역할은 무엇일까?

패키지 안에 init.py 파일이 있으면 패키지가 import될 때 init.py 파일의 코드들이 자동으로 실행된다. 디렉토리에 init.py 파일이 없다면 패키지로 인식되지 않을수도 있다.

적용하는 방법

# __init__.py
from .mod1 import func2
from .mod2 import func3


__all__ = ["fun2", "func3"]

python3.3 버전부터 init.py 파일이 없어도 패키지로 인식하기 때문에 안써도 되지만 python3.3 이전 버전에서는 init.py 파일을 생성해서 사용해야 합니다.

profile
더 나은 개발자가 되자.

0개의 댓글