2017-09-04 8 views
2

예, 비슷한 질문이 있지만 내 문제에 대한 답변이 없습니다. 내 디렉토리 구조는 다음과 같습니다. 모든 __init__.py 파일이 비어 있습니다.. file2.py에서Python3 : 최상위 수준을 넘는 상대 가져 오기

Package/ 
    __init__.py 
    sub_package1/ 
      __init__.py 
      file1.py 
    sub_package2/ 
      __init__.py 
      file2.py 

나는이 다음 코드 : 제가 위에서 언급 한 오류가

from ..sub_package1 import file1 

,

ValueError: attempted relative import beyond top-level package 

비슷한 수입을 scikit 배우기 패키지가 있습니다 및 그것은 그들을 위해 작동합니다. 오류를 제기

명령 :

  1. 작업 디렉토리 : Package/
  2. 명령 : python /path/to/Package/sub_package2/file2.py 상대적으로 수입 일이 당신이 불행하게도, 코드를 호출하는 방법에 따라 달라집니다 여부
+0

"what command"예외가 발생 했습니까? – MSeifert

+0

에 오류를 발생시키는 명령이 추가되었습니다. –

+0

내가 링크 한 복제본은 다른 예외이지만 동일한 해결책 (또한 Jean-Paul이 아래에 응답 한 것과 동일한 솔루션) –

답변

4

.

[email protected]:/tmp$ mkdir Package Package/sub_package{1,2} 
[email protected]:/tmp$ touch Package/__init__.py Package/sub_package{1,2}/__init__.py 
[email protected]:/tmp$ touch Package/sub_package1/file1.py 
[email protected]:/tmp$ echo "from ..sub_package1 import file1" > Package/sub_package2/file2.py 
[email protected]:/tmp$ python Package/sub_package2/file2.py 
Traceback (most recent call last): 
    File "Package/sub_package2/file2.py", line 1, in <module> 
    from ..sub_package1 import file1 
ValueError: Attempted relative import in non-package 
[email protected]:/tmp$ python -m Package.sub_package2.file2 
[email protected]:/tmp$ 

당신은 런타임 Package/sub_package2 모듈 경로의 일부임을 인식하지 못하는 python Package/sub_package2/file2.py합니다. 작업중인 모듈이 file2 일 뿐이라고 생각합니다. 따라서 상대 가져 오기 ..을 해석 할 수 없습니다.

python -m ...과 같이 전체 경로를 사용하여 모듈을 가져 오면 (정상적인 import 문과 마찬가지로) 전체 가져 오기 경로가 인식되고 상대 가져 오기가 제대로 해석 될 수 있습니다.

+0

최상위 수준을 초과하는 오류가 발생합니다. 'ValueError : 상대 가져 오기를 시도했습니다. "non-package"가 아닌 최상위 패키지'''를 넘어서야합니다. –

+1

예외의 특정 텍스트가 많이 중요하지는 않습니다. 내가 설명한 것보다 약간 다른 오류 경로가 발생한다는 것은 사실입니다. 그러나 두 오류의 근본 원인은 같습니다. 최상위 스크립트 인 것처럼 서브 패키지로 사용되는 소스 파일 사용. 이를 피하면이 오류 클래스로부터 안전합니다. –