2013-01-11 2 views
2

은 가정하자 나는로 설정된 프로젝트는 다음과 같습니다 a.py에서같은 디렉토리에서 수입 모듈을 가져 오기

myproject/ 
    setup.py 
    myproject/ 
    __init__.py 
    module1/ 
     __init__.py 
     a.py 
     b.py 
     test/ 
     __init__.py 
     test.py 

나는이 : test.py에서

from b import Something 

내가 가진 :

from myproject.module1 import a 

test.py을 실행하면 ImportError이 표시됩니다. b을 찾을 수 없습니다 - test.py가 다른 디렉토리에 있기 때문에.

from myproject.module1.b import Something을 작성하여 a.py에이 문제를 해결할 수 있음을 알고 있지만 프로젝트 전체에서 너무 자세한 것으로 보입니다.

더 좋은 방법이 있습니까?

+0

myproject에도'__init __. py'가 필요합니까? 'PYTHONPATH'에이 경로가 있습니까? – Alex

+0

@Alex 예, 수정 됨 (사과). 'module1'의 부모 인'myproject'는 PYTHONPATH에 있습니다 – bcoughlan

답변

1

from myproject.module1.b import Something 그것을 할 수있는 가장 좋은 방법입니다 참조하십시오. 조금 장황 할 수도 있지만 일반적으로 파이썬 코드에서 바람직한 품질 인 것이 명시 적입니다.

+1

이상한 Dug와 @Evert가 모두 올바르지 만, 이것은 [PEP8 스타일 가이드] (http://www.python.org/dev/peps/pep-0008/)에 기반한 더 나은 해결책입니다 : "intra에 대한 상대적 수입 - 패키지 가져 오기는 절대 권장되지 않습니다. 항상 모든 가져 오기에 절대 패키지 경로를 사용하십시오 " – bcoughlan

1

relative importsa.py에서 시도 할 수 있습니다.

from .b import Something 

그러나이 방법은 문제의 완전한 해결책이 아닐 수도 있습니다. 디렉토리 구조의 상위 레벨에있는 import 모듈/패키지가있는 모듈과 마찬가지로, 어떻게 실행해야하는지주의해야합니다. 특히 모듈을 python submodule.py으로 실행하면 암시 적으로 모듈의 __name__ 변수를 "__main__"으로 설정합니다. 가져 오기 (상대적 및 절대적으로 비슷 함)는 __name__PYTHONPATH에 종속되므로 하위 모듈을 직접 실행하면 가져 오기가 다르게 작동합니다 (또는 경우에 따라 중단 될 수 있음).

가 실행 해보십시오 당신의 tests.py 패키지 대신 직접 실행의 최상위 레벨에서

python myproject/module1/test/test.py 

있다.

관련 문제