2012-02-03 65 views
11

可能重複:
How to properly use relative or absolute imports in Python modules?蟒蛇相對導入示例代碼不起作用

我有這個文件格式,如本例所示: (這裏下載:http://www.mediafire.com/?oug42nzvxrvoms4http://www.python.org/dev/peps/pep-0328/#guido-s-decision

moduleX包含:

from .moduleY import spam 
from .moduleY import spam as ham 
from . import moduleY 
from ..subpackage1 import moduleY 
from ..subpackage2.moduleZ import eggs 
from ..moduleA import foo 
from ...package import bar 
from ...sys import path 

,這是發生了什麼:

C:\package\subpackage1>python moduleX.py 
Traceback (most recent call last): 
    File "moduleX.py", line 1, in <module> 
    from .moduleY import spam 
ValueError: Attempted relative import in non-package 

我有蟒蛇2.7.2。我有

__init__.py 

文件在每個目錄中。 這段代碼爲什麼不起作用?

+4

我發現這個問答比這個被標記爲重複的問題更有用。 – ArtOfWarfare 2015-06-17 15:02:28

+0

機器人重複標籤器;-) – nicorellius 2017-12-02 07:39:08

回答

20

從文檔:

你可以看到這一點:

相對進口使用一個模塊的屬性來確定數據包中層次結構模塊的位置。如果模塊的名稱不包含任何軟件包信息(例如,它設置爲'main'),則無論模塊實際位於文件系統的哪個位置,相對導入都會被解析爲模塊是頂級模塊。

通過運行它作爲python moduleX.py,你正在做上述。相反,試試這個:

python -m package.subpackage1.moduleX 

這將導入moduleX並將其置於包頂層。從c:\直接在你的情況

package/ 
    __init__.py 
    subpackage1/ 
     __init__.py 
     moduleX.py 
     moduleY.py 
    subpackage2/ 
     __init__.py 
     moduleZ.py 
    moduleA.py 

即:從層次結構的頂部運行

c:\>python -m package.subpackage1.moduleX 

注意一兩件事 - 在moduleX.py進口是這些:

from .moduleY import spam 
from .moduleY import spam as ham 
from . import moduleY 
from ..subpackage1 import moduleY 
from ..subpackage2.moduleZ import eggs 
from ..moduleA import foo 
from ...package import bar 
from ...sys import path 

第二到最後:

from ...package import bar 

要求根文件夾(您的案例中的c:\)是一個包(即:有__init__.py)。此外,它需要在package\__init__.py中定義的bar變量,該變量當前不存在(因此在那裏放置bar = 'bar!'用於測試)。它還要求你升級一級 - 所以你必須將package文件夾放在另一個文件夾中(所以你最終得到c:\toppackage\package)並運行c:\python -m toppackage.package.subpackage1.moduleX

對於此行:

from ...sys import path 

有在上述PEP 328的鏈接一張紙條:

注意,而最後一種情況是合法的,那肯定是不鼓勵(「瘋狂」是單詞Guido使用)。

參見關於這個其他SOqs,可能會幫助:

希望這會有所幫助。