질문
이 디렉토리 구조를 상상해보세요:
app/
__init__.py
sub1/
__init__.py
mod1.py
sub2/
__init__.py
mod2.py
저는 mod1
을 코딩하고 있으며, mod2
에서 무언가를 가져와야 합니다. 어떻게 해야 할까요?
from ..sub2 import mod2
를 시도해봤지만, "Attempted relative import in non-package"라는 오류가 발생합니다.
인터넷에서 검색해봤지만, "sys.path
조작" 트릭만을 찾을 수 있었습니다. 깔끔한 방법은 없을까요?
지금은 모든 __init__.py
가 비어있습니다.
저는 이렇게 하려고 하는데, sub2에는 sub 패키지(sub1
, subX
등) 간에 공유되는 클래스들이 포함되어 있습니다.
원하는 동작은 PEP 366 (John B님 감사합니다)에서 설명한 것과 동일합니다.
답변
문제는 mod1.py를 인터프리터에 인수로 전달하여 모듈을 '__main__'으로 실행하고 있다는 것입니다.
PEP 328에서 다음과 같이 설명합니다:
상대적인 임포트는 모듈의 __name__ 속성을 사용하여 해당 모듈이 패키지 계층 구조에서의 위치를 결정합니다. 모듈의 이름에 패키지 정보가 포함되지 않은 경우 (예: '__main__'으로 설정된 경우), 상대적인 임포트는 모듈이 실제로 파일 시스템 상에서 어디에 위치하든 상위 수준 모듈로 해석됩니다.
Python 2.6에서는 주 모듈을 기준으로 모듈을 참조하는 기능을 추가하고 있습니다. 이 변경 내용은 PEP 366에서 설명하고 있습니다.
Nick Coghlan에 따르면, 권장하는 대체 방법은 -m 스위치를 사용하여 패키지 내에서 모듈을 실행하는 것입니다.
댓글