Python 3의 상대 가져오기: 신비한 오류
Python 3에서 상대 가져오기는 동일한 내부에서 모듈을 가져오는 편리한 방법입니다. 예배 규칙서. 그러나 예상치 못한 오류가 자주 발생합니다.
오류 메시지:
근본 원인:
이러한 오류를 이해하려면 Python의 모듈 가져오기 메커니즘을 자세히 조사해야 합니다. 상대 가져오기를 사용하려면 가져오기 모듈이 패키지 내에 포함되어 있어야 합니다. 패키지는 __init__.py 파일이 있어 패키지로 표시된 디렉터리입니다.
공통 레이아웃:
종종 패키지의 구조는 다음과 같습니다.
main.py mypackage/ __init__.py mymodule.py myothermodule.py
예시 코드:
# Exported function def as_int(a): return int(a) # Test function for module def _test(): assert as_int('1') == 1 if __name__ == '__main__': _test()
# Exported function def add(a, b): return as_int(a) + as_int(b) # Test function for module def _test(): assert add('1', '1') == 2 if __name__ == '__main__': _test()
from mypackage.myothermodule import add def main(): print(add('1', '1')) if __name__ == '__main__': main()
언제 main.py 또는 mypackage/mymodule.py를 실행하면 모든 것이 원활하게 작동합니다. 그러나 mypackage/myothermodule.py 실행은 상대 가져오기로 인해 실패합니다.
from .mymodule import as_int
해결책:
Guido van Rossum이 설명했듯이 이 실패의 원인은 다음과 같습니다. Python은 패키지 내에서 실행 중인 스크립트를 안티패턴으로 처리합니다. 권장되는 해결책은 상대 가져오기를 피하고 대신 절대 가져오기를 사용하는 것입니다:
from mypackage.mymodule import as_int
대체 접근 방식:
여전히 상대 가져오기를 선호하는 경우 -를 사용할 수 있습니다. m 옵션을 사용하여 가져올 모듈을 지정하지만 장황하고 불편함:
python3 -m mypackage.myothermodule
또 다른 대안은 패키지의 상위 디렉터리를 포함하도록 PYTHONPATH를 조작하는 것입니다.
import sys import os SCRIPT_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.append(os.path.dirname(SCRIPT_DIR)) from mypackage.mymodule import as_int
위 내용은 Python 3에서 상대 가져오기가 실패하는 이유는 무엇이며 어떻게 해결할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!