2014-08-30 63 views
2

我知道,相對進口不建議的,比如從PEP8報價:在開發Python模塊時使用絕對導入?

Relative imports for intra-package imports are highly discouraged. Always use the absolute package path for all imports. Even now that PEP 328 is fully implemented in Python 2.5, its style of explicit relative imports is actively discouraged; absolute imports are more portable and usually more readable.

如果我開發包(帶幾個模塊)是什麼?在開發過程中,絕對導入不會在沒有安裝/部署軟件包的情況下運行。這是否意味着我必須定期安裝/部署當前的WIP模塊才能進行測試?

以下是Cld提供的示例。給定一個Python項目/包:

myproject/ 
    package1/ 
    __init__.py 
    somemodule.py 
    package2/ 
    __init__.py 
    somemodule.py 
    somescript.py 
main.py 

main.py,絕對進口工作得很好:

import package1 
import package2.somescript 
import package2.somemodule 

然而,對於模塊,例如somescript.py在包2,以下絕對進口:

import package2.somemodule 
import package1 

這會引發ImportError:

Traceback (most recent call last): 
    File "package2/somescript.py", line 1, in <module> 
    import package2.somemodule 
ImportError: No module named package2.somemodule 
+0

您可以採取的一種方法是將項目的根包含在「PYTHONPATH」環境變量中。然後,所有導入都可以是「絕對」的(即相對於項目的根源)。 – arghbleargh 2014-08-30 15:24:26

+0

這可能是一個解決方案。 – Drake 2014-08-30 16:45:12

回答

2

Depand你'主'文件的位置。

如果您有:

myproject/ 
    package1/ 
    __init__.py 
    somemodule.py 
    package2/ 
    __init__.py 
    somemodule.py 
    somescript.py 
main.py 

somescript.py:

import package2.somemodule 
import package1 

main.py

import package1 
import package2.somescript 
import package2.somemodule 

如果執行:蟒蛇包2/somescript.py你錯誤

Traceback (most recent call last): 
    File "package2/somescript.py", line 1, in <module> 
    import package2.somemodule 
ImportError: No module named package2.somemodule 

但是,如果你執行python main.py,你沒有問題。

+0

感謝這個明確的例子。因此,我如何處理子模塊中的''absolute imports'',例如你的例子中的'somescript.py'? – Drake 2014-08-30 16:44:44

+0

加入'import os,sys; sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__ file__),os.path.pardir)));'在'somescript.py'開頭也許......但真的很髒...... – Cld 2014-08-30 16:58:13

+0

不是一個好主意,因爲部署時你必須對它們進行註釋,這會增加開發測試部署週期的複雜性。 – Drake 2014-08-30 17:14:03