ImportError: attempted relative import with no known parent package
Python 프로그래밍 - ImportError
에러 메세지
모듈을 import하는 과정에서 아래와 같은 오류가 발생했다.
패키지 구조는 다음과 같았다.
원인
파이썬 인터프리터는 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 출력
상대경로는 모듈 내부에서만 사용할 수 있다.
아무 옵션 없이 인터프리터로 실행하는 건 모듈이 아니라 스크립트로써 실행시키는 것이다.
Comments