-
ImportError 메세지 통해서 절대경로와 상대경로 구분하기Python 2021. 12. 6. 17:59
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.
위의 글은 파이썬 공식 문서의 글을 따온 것입니다.
"상대경로로 import 시 현재 module의 이름을 기반으로 합니다.
main 모듈의 이름은 항상 "__main__"이기 때문에, 파이썬 어플리케이션은 항상 절대경로를 사용해야 합니다." 라고 설명하고 있습니다.
이제 위의 에러메세지를 다시 살펴보겠습니다.
Traceback (most recent call last):
File "C:\Users\admin\PycharmProjects\test_env\calculator\main.py", line 1, in <module>
from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package
터미널에서 직접 python 파일을 실행시키면 __name__ == '__main__' 이 됩니다. 그러면 파이썬은 __main__이라는 모듈의 위치를 알 수가 없기 때문에 에러가 발생하는 것입니다.
이 에러를 해결하는 방법은 "절대경로를 사용"하는 것입니다!
상대경로로 import 한 add_and_multiply 모듈을 직접 실행할 경우 또 ImportError: attempted relative import with no known parent package 가 발생합니다.
main.py에서 직접 실행할 경우에는 add_and_multiply 모듈이 상대경로를 사용했더라도 "add_and_multiply 모듈"을 직접 실행시키지 않았기에 문제가 없습니다.
그렇지만 직접 실행할 경우에는 위에서의 문제와 같은 상황에 맞딱드리게 됩니다. 아래 부분을 다시 읽어보시죠.
"터미널에서 직접 python 파일을 실행시키면 __name__ == '__main__' 이 됩니다. 그러면 당연히 __main__이라는 모듈의 위치를 파이썬이 알 수가 없기 때문에 에러가 발생하는 것입니다."
이와 같은 상황에서 상대경로를 사용하면 파이썬은 어디를 기준으로 해야하는지 알 수가 없기에 에러가 뜬다고 봅니다. 그래서 직접 실행할 경우에는 절대경로를 사용하시면 문제 없이 작동되는 것을 확인하실 수 있습니다.
자세히 잘 설명해주신 글이 있기에 아래에 참고사이트를 남겨두겠습니다.
https://livetodaykono.tistory.com/23
'Python' 카테고리의 다른 글
Python dictionary get 메소드 vs Django objects get 메소드 (0) 2022.01.02 Python 용어 정리 (0) 2021.12.15 Function Parameter & Argument (0) 2021.12.09 sys.modules & sys.path / absolute Path & relative Path (0) 2021.12.05 파이썬 기초 (Data Types, Variable, Operation) (0) 2021.12.04