2017-09-04 73 views
2

是的,有類似的問題,但它們不回答我的問題。我的目錄結構如下,所有的__init__.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

你可以包括「什麼命令」引發異常? – 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$ 

當你python Package/sub_package2/file2.py運行時不能識別Package/sub_package2是模塊路徑的一部分。它認爲你正在使用的模塊只是file2。所以它不能解釋..的相對導入。

當您使用其完整路徑導入模塊時,如python -m ...所做的(和任何常規導入語句一樣),可以識別完整的導入路徑,並且可以正確解釋相對導入。

+0

我得到錯誤(超出頂層):'''ValueError:企圖相對導入超出頂層包''',而不是「非包」 –

+1

我不確定異常的特定文本很重要。確實,你遇到了一個與我展示的略有不同的錯誤路徑。但是,這兩種錯誤的根本原因都是一樣的。使用一個源文件,這個文件應該是一個子包,就像它是一個頂層腳本一樣。如果你避免這種情況,那麼你會從這類錯誤中安然無恙。 –