다음 디렉토리 구조로 PEP 328 을 따르려고합니다 .
pkg/
__init__.py
components/
core.py
__init__.py
tests/
core_test.py
__init__.py
에서 core_test.py
나는 다음과 같은 import 문을
from ..components.core import GameLoopEvents
그러나 실행할 때 다음 오류가 발생합니다.
tests$ python core_test.py
Traceback (most recent call last):
File "core_test.py", line 3, in <module>
from ..components.core import GameLoopEvents
ValueError: Attempted relative import in non-package
주위를 검색하면 ” __init__.py ” 와도 ” 상대 경로가 작동하지 않습니다 “와 ” 상대 경로에서 모듈 가져 오기 “가 발견되었지만 도움이되지 않았습니다.
여기서 누락 된 것이 있습니까?
답변
예. 패키지로 사용하지 않습니다.
python -m pkg.tests.core_test
답변
Ignacio Vazquez-Abrams의 답변 을 자세히 설명하려면 다음과 같이하십시오.
파이썬 가져 오기 메커니즘은 __name__
현재 파일과 관련하여 작동 합니다. 파일을 직접 실행할 때는 일반적인 이름이 없지만 "__main__"
대신 이름이 있습니다. 따라서 상대 수입품이 작동하지 않습니다.
Igancio가 제안한대로 -m
옵션을 사용하여 실행할 수 있습니다. 패키지로 스크립트로 실행되도록 패키지의 일부가있는 경우 해당 __package__
속성을 사용하여 해당 파일에 패키지 계층 구조에있는 이름 을 지정할 수도 있습니다 .
자세한 내용은 http://www.python.org/dev/peps/pep-0366/ 을 참조하십시오.
답변
import components.core
현재 디렉토리를 sys.path
다음에 추가하면 직접 사용할 수 있습니다 .
if __name__ == '__main__' and __package__ is None:
from os import sys, path
sys.path.append(path.dirname(path.dirname(path.abspath(__file__))))
답변
스크립트를 시작하려는 방법에 따라 다릅니다.
고전적인 방법으로 명령 행 에서 UnitTest 를 시작하려면 다음과 같습니다.
python tests/core_test.py
이 경우 ‘components’ 및 ‘tests’ 는 형제 폴더이므로 sys.path 모듈 의 insert 또는 append 메소드를 사용하여 상대 모듈을 가져올 수 있습니다 . 다음과 같은 것 :
import sys
from os import path
sys.path.append( path.dirname( path.dirname( path.abspath(__file__) ) ) )
from components.core import GameLoopEvents
그렇지 않으면 ‘-m’인수를 사용하여 스크립트를 시작할 수 있습니다 (이 경우 패키지에 대해 이야기하고 있으므로 ‘.py’ 확장자 를 지정해서는 안 됨 ).
python -m pkg.tests.core_test
이 경우 상대 임포트를 간단하게 사용할 수 있습니다.
from ..components.core import GameLoopEvents
마지막으로 두 가지 접근 방식을 혼합하여 스크립트 호출 방식에 관계없이 스크립트가 작동하도록 할 수 있습니다. 예를 들면 다음과 같습니다.
if __name__ == '__main__':
if __package__ is None:
import sys
from os import path
sys.path.append( path.dirname( path.dirname( path.abspath(__file__) ) ) )
from components.core import GameLoopEvents
else:
from ..components.core import GameLoopEvents
답변
core_test.py에서 다음을 수행하십시오.
import sys
sys.path.append('../components')
from core import GameLoopEvents
답변
유스 케이스가 테스트를 실행하기위한 것이고 그것이 솔기 인 경우 다음을 수행 할 수 있습니다. 테스트 스크립트를 실행 python core_test.py
하는 대신와 같은 테스트 프레임 워크 를 사용하십시오 pytest
. 그런 다음 명령 행에 다음을 입력 할 수 있습니다.
$$ py.test
그러면 디렉토리에서 테스트가 실행됩니다. 이 문제 걸어 다니는 __name__
존재 __main__
@BrenBarn 지적했다. 다음으로, __init__.py
테스트 디렉토리에 빈 파일을 넣으면 테스트 디렉토리가 패키지의 일부가됩니다. 그럼 당신은 할 수있을 것입니다
from ..components.core import GameLoopEvents
그러나 테스트 스크립트를 기본 프로그램으로 실행하면 다시 실패합니다. 테스트 러너를 사용하십시오. 어쩌면 이것은 다른 테스트 러너와도 작동 nosetests
하지만 확인하지 않았습니다. 도움이 되었기를 바랍니다.
답변
내 빠른 해결책은 디렉토리를 경로에 추가하는 것입니다.
import sys
sys.path.insert(0, '../components/')