[python] 상대 가져 오기-ModuleNotFoundError : x라는 모듈이 없습니다.

이것은 내가 실제로 앉아서 Python 3을 사용해 보았을 때 처음으로 실패한 것처럼 보입니다. 다음 두 파일이 있습니다.

  1. test.py
  2. 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'

그래서 나는 여기서 무엇을 해야할지에 대해 상실하고 있습니다 … 어떤 도움이라도 대단히 감사합니다. 🙂



답변

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__ 모듈과 패키지에 속하는 대해 아무것도 알지 못한다. 그러나 폴더가 sys.path에 추가 import config되므로 작동해야합니다 ryan.

대신 main.py를 실행하자 :

$ python main.py
ryan.test
True
Absolute import failed

그리고 여기서 테스트는 “ryan”패키지 안에 있으며 상대적인 가져 오기를 수행 할 수 있습니다. import config암시 적 상대 가져 오기는 Python 3에서 허용되지 않으므로 실패합니다.

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

추신 : 파이썬 3을 고수하고 있다면 더 이상 __init__.py파일이 필요하지 않습니다 .


답변

나는 그것을 알아. 특히 python2에서 오는 매우 좌절.

.모듈이 상대인지 절대인지에 관계없이 모듈 에 a를 추가해야합니다 .

다음과 같이 디렉토리 설정을 작성했습니다.

/main.py
--/lib
  --/__init__.py
  --/mody.py
  --/modx.py

modx.py

def does_something():
    return "I gave you this string."

mody.py

from modx import does_something

def loaded():
    string = does_something()
    print(string)

main.py

from lib import mody

mody.loaded()

main을 실행하면 이런 일이 발생합니다.

$ python main.py
Traceback (most recent call last):
  File "main.py", line 2, in <module>
    from lib import mody
  File "/mnt/c/Users/Austin/Dropbox/Source/Python/virtualenviron/mock/package/lib/mody.py", line 1, in <module>
    from modx import does_something
ImportError: No module named 'modx'

2to3을 실행했으며 핵심 출력은 다음과 같습니다.

RefactoringTool: Refactored lib/mody.py
--- lib/mody.py (original)
+++ lib/mody.py (refactored)
@@ -1,4 +1,4 @@
-from modx import does_something
+from .modx import does_something

 def loaded():
     string = does_something()
RefactoringTool: Files that need to be modified:
RefactoringTool: lib/modx.py
RefactoringTool: lib/mody.py

mody.py의 import 문을 수정하여 수정해야했습니다.

try:
    from modx import does_something
except ImportError:
    from .modx import does_something


def loaded():
    string = does_something()
    print(string)

그런 다음 main.py를 다시 실행하고 예상 출력을 얻었습니다.

$ python main.py
I gave you this string.

마지막으로, 정리하고 2에서 3 사이의 휴대 성을 제공하십시오.

from __future__ import absolute_import
from .modx import does_something


답변

PYTHONPATH를 설정하면이 문제에 도움이 될 수 있습니다.

Windows에서 수행하는 방법은 다음과 같습니다.

set PYTHONPATH=.


답변

에 모듈 경로를 추가해야합니다 PYTHONPATH.


UNIX의 경우 (Linux, OSX, …)

export PYTHONPATH="${PYTHONPATH}:/path/to/your/module/"

Windows의 경우

set PYTHONPATH=%PYTHONPATH%;C:\path\to\your\module\


답변

모범을 보았습니다

from . import config

다음 SystemError가 발생했습니다.
/usr/bin/python3.4 test.py
Traceback (가장 최근 호출) :
“test.py”파일, 1 행
. import config
SystemError : 상위 모듈 ”이 (가)로드되지 않았습니다. 상대적 가져 오기를 수행 할 수 없습니다


이것은 나를 위해 작동합니다 :

import config
print('debug=%s'%config.debug)

>>>debug=True

Python으로 테스트 : 3.4.2-PyCharm 2016.3.2


이 PyCharm 옆에이 이름가져올 수 있습니다 .
를 클릭 config하면 도움말 아이콘이 나타납니다.
여기에 이미지 설명을 입력하십시오


답변

테스트 디렉토리에 다음 파일을 추가하면 파이썬이 테스트 전에 파일을 실행합니다.

__init__.py file

import os
import sys
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))


답변

PYTHONPATH루트 프로젝트 디렉토리에서 환경 변수를 설정하십시오 .

유닉스 계열을 고려하면 :

export PYTHONPATH=.