2016-02-11 58 views
0

我看到很多人使用下列導入方法在自己的項目:dot_module和dot_dot_module當導入模塊

from .module1 import a,b 
from ..module2 import * 

模塊1和模塊2是一個.py文件,而不是包的文件夾。與import module有什麼不同?這是否意味着在當前和../文件夾中導入模塊?但是,當我嘗試導入同一文件夾中的另一個文件,它說:

import .other 
>>> SyntaxError: Invalid syntax 
from .other import * 
>>> ValueError: Attempted relative import in non-package 

我就可以了好奇。謝謝〜

回答

2

你看到的是相對進口。它們允許您通過指定其相對路徑來導入模塊,而無需對定義模塊的包的名稱進行硬編碼。

這是否意味着導入模塊在當前和../文件夾?

是。

查看PEP 328瞭解更多詳情。注意它說:

相對進口必須始終使用from <> import; import <>絕對爲 。

這就是爲什麼在嘗試import .foo時得到SyntaxError

ValueError可能是因爲您正在將導入文件作爲腳本運行(並且它曾經讓我很困惑)。您需要將它作爲一個包運行(使用-m開關)以使相關導入生效。也就是說,假設foo.py相對導入其他模塊,您無法通過

$ python foo.py # non-package error 

運行它,而不是你做

$ python -m foo 

請參閱相關的問題:How to do relative imports in Python

+0

謝謝〜我第一次知道'相對導入'。我在解釋器中使用包含'from .other import *'的'import a'來測試。所以在這種情況下它不是'__main__'。另外,我嘗試'python -m a',甚至爲'python -m b'創建一個新的腳本b(包含'import a')。它仍然引發相同的ValueError ... – platinhom

+0

@platinhom你可以在OP中佈局你的目錄結構嗎? – gil

+0

目錄結構是:a.py,b.py和other.py都在同一個文件夾中。我在這個文件夾中添加一個__init__.py,使它看起來像一個包。但運行b.py('import a')仍然不起作用。但是,當我將b.py移動到上面的文件夾('b.py','test/a.py','test/other.py','test/__ init __。py')並將b.py修改爲' import test.a','from other import *'起作用!看起來有必要將'a.py'作爲一個包中的模塊。 – platinhom