>백엔드 개발 >파이썬 튜토리얼 >Python 3에서 상대 가져오기가 실패하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Python 3에서 상대 가져오기가 실패하는 이유는 무엇이며 어떻게 해결할 수 있습니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-27 14:49:17978검색

Why Do Relative Imports in Python 3 Fail, and How Can I Fix Them?

Python 3의 상대 가져오기: 신비한 오류

Python 3에서 상대 가져오기는 동일한 내부에서 모듈을 가져오는 편리한 방법입니다. 예배 규칙서. 그러나 예상치 못한 오류가 자주 발생합니다.

오류 메시지:

  • ImportError: 알려진 상위 패키지 없이 상대 가져오기를 시도했습니다.
  • ModuleNotFoundError: 'mymodule'이라는 모듈이 없습니다.
  • SystemError: 상위 모듈 ''이(가) 아닙니다. 로드되어 상대 가져오기를 수행할 수 없습니다

근본 원인:

이러한 오류를 이해하려면 Python의 모듈 가져오기 메커니즘을 자세히 조사해야 합니다. 상대 가져오기를 사용하려면 가져오기 모듈이 패키지 내에 포함되어 있어야 합니다. 패키지는 __init__.py 파일이 있어 패키지로 표시된 디렉터리입니다.

공통 레이아웃:

종종 패키지의 구조는 다음과 같습니다.

main.py
mypackage/
    __init__.py
    mymodule.py
    myothermodule.py

예시 코드:

  • mymodule.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()
  • myoth ermodule.py
# 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()
  • main.py
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.