이것은 내가 실제로 앉아서 Python 3을 사용해 보았을 때 처음으로 실패한 것처럼 보입니다. 다음 두 파일이 있습니다.
- test.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'
그래서 나는 여기서 무엇을 해야할지에 대해 상실하고 있습니다 … 어떤 도움이라도 대단히 감사합니다. 🙂
답변
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=.