스택큐힙리스트

상대적인 가져 오기 - ModuleNotFoundError: 모듈 이름 x가 없음 본문

카테고리 없음

상대적인 가져 오기 - ModuleNotFoundError: 모듈 이름 x가 없음

스택큐힙리스트 2023. 4. 14. 08:28
반응형

이것은 내가 파이썬 3을 진정으로 시도해본 첫 번째 시간이며, 열심히 계속 실패하고있습니다. 다음 두 개의 파일이 있습니다.

테스트.py

config.py

config.py 파일에는 몇 가지 함수와 변수가 정의되어 있습니다. 다음과 같이 간략하게 줄였습니다.

config.py

debug = True

test.py

import config

print (config.debug)

저도 __init__.py이 있어요.

하지만 다음과 같은 오류가 발생합니다:

ModuleNotFoundError: No module named 'config'

나는 py3 규약이 절대경로를 사용하는 것을 알고 있습니다.

from . import config

그러나 이로 인해 다음과 같은 오류가 발생합니다:

ImportError: cannot import name 'config'

그러니까 여기서 무엇을 해야 하는지 모르겠습니다... 어떠한 도움도 크게 감사드립니다. :)

답변 1

TL;DR: __main__ 모듈이 패키지의 일부가 아니므로 실행하는 파일에서 상대적인 임포트를 할 수 없습니다.

절대 경로 추출 - sys.path에서 사용 가능한 무언가를 가져옵니다.

상대적인 임포트 - 현재 모듈과 관련된 것을 임포트하며, 패키지의 일부여야 합니다.

만약 두 가지 변형을 완전히 동일한 방식으로 실행한다면, 둘 중 하나는 작동해야 합니다. 다음 예제를 통해 무슨 일이 벌어지는지 이해하는 데 도움이 될 것입니다. 전체 디렉토리 구조와 함께 main.py 파일을 하나 더 추가해 봅시다.

.

./main.py

./ryan/__init__.py

./ryan/config.py

./ryan/test.py

그리고 무슨 일이 일어나고 있는지 확인하기 위해 test.py 업데이트합시다.

# config.py

debug = True

# test.py

print(__name__)

try:

# Trying to find module in the parent package

from . import config

print(config.debug)

del config

except ImportError:

print('Relative import failed')

try:

# Trying to find module on sys.path

import config

print(config.debug)

except ModuleNotFoundError:

print('Absolute import failed')

# main.py

import ryan.test

먼저 test.py를 실행해보자:

$ python ryan/test.py

__main__

Relative import failed

True

여기서 테스트는 __main__ 모듈이며 패키지에 속해있는 지는 알지 못합니다. 그러나 import config는 작동해야합니다. 왜냐하면 ryan 폴더가 sys.path에 추가되기 때문입니다.

대신 main.py를 실행해 봅시다.

$ python main.py

ryan.test

True

Absolute import failed

여기서 테스트는 ryan 패키지 내부에 있으며 상대적 임포트를 수행할 수 있습니다. import config은(는) 암시적인 상대적 임포트가 Python 3에서 허용되지 않기 때문에 실패합니다.

이것이 도움이 되었기를 바랍니다.

P.S.: 만약 Python 3를 사용한다면, 더 이상 __init__.py 파일이 필요하지 않습니다.

답변 2

상대적 임포트 - ModuleNotFoundError: 모듈 x를 찾을 수 없습니다.

상대적 임포트는 파이썬 프로그래밍에서 중요한 개념 중 하나입니다. 이는 다른 모듈에서 현재 모듈을 불러올 때 사용되며, 절대 경로 대신 상대 경로를 사용합니다. 그러나 때로는 ModuleNotFoundError: No module named x와 같은 오류 메시지가 표시될 수 있습니다. 이 문제를 해결하려면 다음과 같은 방법이 있습니다.

첫째, 모듈 이름이 정확한지 확인하십시오. ModuleNotFoundError는 해당 모듈을 찾을 수 없는 경우에 표시됩니다. 모듈 이름이 올바른지 확인하고 다시 시도해 보십시오.

둘째, 현재 모듈에서 불러오는 모듈이 있는지 확인하십시오. 임포트하는 모듈은 현재 모듈과의 관계에 따라 다릅니다. 상대 임포트를 사용할 때 현재 모듈에서 불러오는 모듈의 위치에 대해 확실히 알아두는 것이 중요합니다.

셋째, 파이썬 인터프리터 경로에 모듈이 포함되어 있는지 확인하십시오. 때로는 모듈이 인터프리터 경로에 없기 때문에 ImportError나 ModuleNotFoundError가 발생할 수 있습니다. 모듈이 설치되어 있지 않으면 pip를 사용하여 모듈을 설치해야 합니다.

넷째, 모듈의 이름이 겹치는 경우가 있는지 확인하십시오. 모듈 이름 충돌은 종종 문제를 일으킵니다. 다른 모듈에 동일한 이름의 모듈이 있는 경우 임포트 문이 올바른 모듈을 참조하고 있는지 확인해야 합니다.

마지막으로, 상대 임포트 대신 절대 임포트를 사용할 수도 있습니다. 절대 임포트는 모듈의 위치와 관계없이 항상 모듈을 찾습니다. 절대 임포트를 사용하면 불필요한 복잡성이 제거되어 코드의 가독성이 향상됩니다.

상대적 임포트 오류를 해결하는 것은 중요한 프로그래밍 기술입니다. 올바른 모듈 이름, 위치, 충돌 및 경로 설정을 확인하고 상대 임포트 대신 절대 임포트를 고려하는 것이 좋습니다. 이를 통해 코드의 가독성과 유지 보수성이 향상됩니다.

반응형
Comments