2016-07-28 4 views
2

을 찾을 수 없습니다. 이것은 매우 간단한 문제이며, 나는 아주 확실한 것을 놓쳤다 고 확신합니다. 그러나이 곤경에 대한 대답은 지금 몇 시간 동안 나를 피했습니다.Python Relative Import가 패키지

내 프로젝트 디렉토리 구조는 다음과 같습니다

-PhysicsMaterial 
    -Macros 
     __init__.py 
     Macros.py 
    -Modules 
     __init__.py 
     AvgAccel.py 
     AvgVelocity.py 
    -UnitTests 
     __init__.py 
     AvgAccelUnitTest.py 
     AvgVelocityUnitTest.py 
    __init__.py 

비판 따로 내 이름 지정 규칙을 여기 디렉토리 구조에, 나는 상대의 수입을 사용할 수 있도록 수없는 것. 내가 상대 수입에 모듈 파일을 시도하고있어하는 AvgAccelUnitTest.py에서 테스트 할 : 나는 파일을 설정 내 초기화를 모두 가지고 있기 때문에

ValueError: Attempted relative import in non-package 

:

from .Modules import AvgAccel as accel 

는 그러나, 나는 점점 계속 내 구조 전반에 걸쳐, 그리고 또한 상위 디렉토리가 내 PYTHONPATH에 추가되었습니다, 나는 곤두박질 쳤습니다. 왜 파이썬은 패키지를 해석하지 않고 파일을 올바르게 임포트하지 않습니까?

답변

2

이것은 스크립트를 __main__으로 실행하고 있기 때문에 발생합니다. 이 같은 스크립트를 실행하면 :

파일이 없습니다 package.module로, __main__로로드, 그래서 패키지의 일부가 아니므로이 상대적으로 수입을 할 수
python /path/to/package/module.py 

.

스크립트에 정의 된 클래스가 __main__.Class으로 다시 한번 package.module.Class으로 두 번 정의되는 이상한 오류가 발생할 수 있습니다. 이로 인해 isinstance 검사가 실패하고 유사한 유사성이 발생할 수 있습니다. 이 때문에 일반적으로 모듈을 직접 실행하면 안됩니다.

테스트의 경우 테스트 디렉토리에있는 __init__.py을 제거하고 상대 가져 오기 대신 절대 값을 사용할 수 있습니다. 실제로, 당신의 테스트는 아마 당신의 패키지 안에 있으면 안됩니다.

또는 테스트를 가져 와서 실행하는 테스트 러너 스크립트를 만들 수 있습니다.

+0

@ Brendan Abel 정보를 제공해 주셔서 감사합니다. 좀 더 연구를 한 후에, 나는 똑같은 결론을 내 렸습니다. 궁극적으로, 나는 sys.path.append를 사용하고 절대적인 임포트를 수행하게되었습니다. 디렉토리 안에 모듈을 재배치 할 생각이 없기 때문에 더 신경 쓰지 않아야합니다. 이것은 실제로 필자가 필요로했던 함수 데코레이터와 관련된 또 다른 import 문제를 해결해 주므로 두 가지 장점이 있습니다! –

+0

다른 모듈이 명령 줄에서 실행중인 동일한 모듈을 가져 오는 경우에도 문제가 계속 발생할 수 있습니다. –

+0

내가 그 다리에 올 때 나는 그것을 건너 뛸 것 같아. 그때가되면 더 나은 해결책을 찾을 수있을 것입니다. 이것은 출품 할 의도가 거의없는 취미 프로그램 일 뿐이므로 좋다고 생각합니다. –