Python

ImportError 메세지 통해서 절대경로와 상대경로 구분하기

Bruno-Jang 2021. 12. 6. 17:59

ImportError

 

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__이라는 모듈의 위치를 알 수가 없기 때문에 에러가 발생하는 것입니다.

이 에러를 해결하는 방법은 "절대경로를 사용"하는 것입니다!

절대경로 적용 화면 from calculator.add_and_multiply import add_and_multiply

 

add_and_multiply 모듈을 직접 실행시 상대경로로 import 하는 경우에 발생하는 에러 (ImportError)

상대경로로 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__이라는 모듈의 위치를 파이썬이 알 수가 없기 때문에 에러가 발생하는 것입니다."

 

이와 같은 상황에서 상대경로를 사용하면 파이썬은 어디를 기준으로 해야하는지 알 수가 없기에 에러가 뜬다고 봅니다. 그래서 직접 실행할 경우에는 절대경로를 사용하시면 문제 없이 작동되는 것을 확인하실 수 있습니다.

add_and_multiply 모듈 직접 실행시 절대경로 사용

 

 

 

자세히 잘 설명해주신 글이 있기에 아래에 참고사이트를 남겨두겠습니다.

https://livetodaykono.tistory.com/23

 

[Python 기초] Module & Package 이해하기 4(실습)

[Python 기초] Module & Package 이해하기 1(Module) [Python 기초] Module & Package 이해하기 2(Package) [Python 기초] Module & Package 이해하기 3(import 순서) [Python 기초] Module & Package 이해하기 4(..

livetodaykono.tistory.com

https://velog.io/@anjaekk/python%EC%A0%88%EB%8C%80%EA%B2%BD%EB%A1%9C%EC%83%81%EB%8C%80%EA%B2%BD%EB%A1%9C-%EC%83%81%EB%8C%80%EA%B2%BD%EB%A1%9C-import-%EC%97%90%EB%9F%AC%EC%9D%B4%EC%9C%A0%EC%99%80-%ED%95%B4%EA%B2%B0

 

[python]절대경로&상대경로, 상대경로 import 에러 이유와 해결

Absolute path(절대경로)와 Relative path(상대경로), 그리고 상대경로를 이용해여 import 했을 때 생기는 에러에 대해 알아보자.

velog.io