# main.py
# relative path
from .calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1,2))
main.py를 (from .calculator.add_and_multiply import add_and_multiply) 같이 상대 경로로 패키지를 실행했을 때아래와 같은 에러가 발생한다.
Traceback (most recent call last):
File "abc/main.py", line 5, in <module>
from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package
원인은 python interpreter는 상대 경로로 모듈을 import 할 때 위치를 정할 때, 기준이 되는 모듈의 위치가 (name)속성에 의해 결정된다. 그런데 (main) 으로 작성되어 있으므로 파이썬 interpreter는 알 수 없어서 에러가 발생한다.
modules intended for use as the main module of a Python application must always use absolute imports. (파이썬 공식 문서)
오류 발생
multiplication.py는 add_and_multiply.py와 같은 경로상에 있으므로 .을 사용하면 오류가 발생한다.
init.py파일은 해당 경로가 패키지의 일부임을 알려주는 역할을 한다. 만약 calculator 패키지 안에 init.py가 없다면 안에 있는 calculator를 패키지를 인식하지 않는다.
python3.3부터는 init.py 파일이 없어도 패키지로 인식하지만, 하위 버전 호환을 위해서 init.py 파일을 생성하는 것이 좋다.