Python 프로그래밍 - ImportError

에러 메세지

모듈을 import하는 과정에서 아래와 같은 오류가 발생했다. error message

패키지 구조는 다음과 같았다. 에러 상황

원인

파이썬 인터프리터는 import 대상(모듈, 패키지)의 경로를 결정할때 __name__ 변수에 저장된 값을 사용한다. 그런데 터미널에서 python foo.py와 같이 직접 실행하게 되면 __name__의 값은 __main__이 된다. 그리고

해결 방법

-m 실행 옵션 사용

  • $ python foo.py - foo.py 파일을 스크립트로써 실행. 패키지에 대해 알지 못한다.
  • $ python -m python.foo - 인터프리터가 내부적으로 패키지를 관리하게 된다. __package__라는 변수에 패키지 이름이 저장된다.
# foo.py
# from . import mymodule

print(__name__)
print(__package__)

foo.py가 존재하는 디렉토리에서 실행

$ python foo.py
  • __name__: __main__ 출력
  • __package: None 출력

foo.py가 존재하는 디렉토리에서 실행

$ python -m foo
  • __name__: __main__ 출력
  • __package: 공백 출력

foo.py가 존재하는 경로의 상위 디렉토리에서 실행

$ cd ..
$ python -m study.foo
  • __name__: __main__ 출력
  • __package: study 출력

상대경로는 모듈 내부에서만 사용할 수 있다.
아무 옵션 없이 인터프리터로 실행하는 건 모듈이 아니라 스크립트로써 실행시키는 것이다.

reference

Categories:

Updated:

Comments