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-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을 사용하면 오류가 뜨지 않는다.
패키지 안에 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 파일을 생성해서 사용해야 합니다.