본문 바로가기
Python/Python FAQ

Python 파이썬에서 상대적인 임포트를 어떻게 할 수 있을까요?, How can I do relative imports in Python?

by 베타코드 2023. 9. 11.
반응형

질문


이 디렉토리 구조를 상상해보세요:

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 스위치를 사용하여 패키지 내에서 모듈을 실행하는 것입니다.

반응형

댓글