2012-04-22 2 views
2

이 질문은 여러 번 요청되었지만 제공되는 솔루션 중 어느 것도 내 경우에는 작동하지 않습니다. 내 프로젝트 구조는 다음과 같다 : 부모 및 형제 패키지에서 파이썬 모듈을 가져 오는 방법

| project_2 
     main.py 
     __init__.py 
     systems.py 
     | config 
      __init__.py 
      options.py 
     | database 
      __init__.py 
      database.py 
      entity.py 
     | tests 
      __init__.py 
      test_systems.py 
      test_options.py 
      test_database.py 
      test_entity.py 

은 분명히 내가 테스트 패키지에서 테스트 모듈에있는 모든 모듈을 가져와야합니다.

from ..systems import System 
from ..config import options 
from ..database.entity import Entity 

가 돌려 ValueError를 : 나는 도트 구문 상대적으로 수입을 시도되지 않은 패키지에 상대적 가져 오기를 시도합니다. 나는 모든 것을 (시스템을 포함하여) 자체 패키지에 포함하고있는 패키지 구조로 시도했다. 동일한 메시지로 실패합니다.

내게 정말 귀찮은 것은 이것이 작동해야한다는 것입니다 : PEP 328,하지만 그렇지 않습니다. 필자는 $ PYTHONPATH에 패키지를 추가하지 않거나 파일 경로에서 imp로 모듈을로드하는 것과 같은 정신없는 방법을 사용하고 싶지 않습니다.

필자는 systems.py가 메인 패키지에있는 것일 수 있지만, 나머지 수입은 왜 작동하지 않는지에 대해서는 설명하지 못했다.

P. 실제로 PEP 328의 예제를 테스트 해 보았지만 작동하지 않습니다.

답변

0

파이썬 파일이 상대 가져 오기를 수행하지만 해당 파일이 다른 모듈 (예 : 명령 줄 등)에서 가져 오기를 통해 모듈로로드되지 않을 때 발생합니다. 을 감안할 때이 구조 :

. 
├── main.py 
└── test 
    ├── __init__.py 
    ├── a.py 
    └── b.py 

main.py :

from test.a import A 
print A 

a.py :

from .b import B 
A = B 

if __name__ == '__main__': 
    print A 

b.py : 이제

B = 'b' 

시도 :

,
python main.py 

결과는

b 

python test/a.py 

함께 당신이 얻을 :

Traceback (most recent call last): 
    File "test/a.py", line 1, in <module> 
    from .b import B 
ValueError: Attempted relative import in non-package 

어떤 작업을 수행하는 것입니다 :

python -m test.a 
0

.을 파이썬 경로에 간단하게 추가하면 과 같은 상대 경로 project_2 폴더에서 스크립트를 실행하면 작동합니다. 불행히도 모든 컴퓨터에서 PYTHONPATH를 업데이트해야합니다.

파이썬에서 테스트 됨 2.7.14

관련 문제