앞서 포스팅했던 파이썬의 모듈과 패키지에 대해 연습해보겠습니다.
calculator
디렉토리를 만들어줍니다.__init__.py
add_and_multiply.py
multiplication.py
main.py
from .calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1,2))
__add_and_multiply.py__
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
__multiplication.py__
def multiply(a,b):
return(a*b)
calculator
모듈을 불러온 main.py
를 실행하면 다음과 같은 에러가 발생합니다.
해결 방법 중 하나로 절대경로를 명시해주는 방벙이 있습니다.
파이썬의 공식 문서에는 다음과 같이 설명하고 있습니다.
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.
즉, 실행된 main.py
는 __main__
으로 모듈 이름이 변경이 됩니다.
상대경로로 작성할 때는 main.py
를 기준으로 해당 파일의 경로를 탐색합니다.
하지만 __main__
으로 이름이 변경되어 실행되면서 기준이 되는 파일을 찾을 수 없다는 것입니다.
따라서 위 main.py
모듈에서 import하는 모듈의 경로를 다음과 같이 절대 경로로 수정하여 주겠습니다.
from calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1,2))
결과는 다음과 같습니다.
[참고자료]
https://docs.python.org/3/tutorial/modules.html#intra-package-references
실행되는 기본 모듈은 __name__
이 __main__
으로 변경된다는 점을 위에서 언급했습니다.
그렇다면 기본 모듈이 아닌 B모듈에서 C모듈을 import 할 때에도 절대경로를 사용해야 할까요?
코드를 통해 알아보겠습니다.
우선 절대경로로 multiply
모듈을 import 해보겠습니다.
__add_and_multiply.py__
from calculator.multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
print(f"모듈 name: {__name__}")
return multiply(a,b) + (a+b)
결과는 다음과 같습니다:
이번에는 상대경로로 multiply
모듈을 import 해보겠습니다.
__add_and_multiply.py__
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
print(f"모듈 name: {__name__}")
return multiply(a,b) + (a+b)
결과는 역시 다음과 같습니다.
실행되는 모듈의 이름은 __main__
이었습니다.
그 외 모듈은 어떤 이름을 갖고 있을까요?
print(f"module Name: {__name__}")
위 코드를 통해 알아본 결과 __add_and_multiply.py__
의 name
은 다음과 같습니다.
이를 통해 기본 모듈이 아닌 이상 절대경로나 상대경로를 사용하여도 무방하다는 사실을 알게되었습니다.
실행되는 기본 모듈 : import 시 절대경로 사용
그 외 모듈: 절대/상대경로 사용