2013-01-11 105 views
2

想我已經建立了一個項目如下:導入從同一目錄導入模塊

myproject/ 
    setup.py 
    myproject/ 
    __init__.py 
    module1/ 
     __init__.py 
     a.py 
     b.py 
     test/ 
     __init__.py 
     test.py 

a.py我:

from b import Something 

test.py我:

from myproject.module1 import a 

當我運行test.py時,我得到一個ImportError,因爲b無法找到 - 因爲test.py位於不同的目錄中。

我知道我可以通過編寫from myproject.module1.b import Something來解決這個問題a.py,但是這在整個項目中似乎太冗長了。

有沒有更好的方法?

+0

您是否需要在項目中使用'__init __。py'?這是「PYTHONPATH」中的路徑嗎? – Alex

+0

@Alex是的,編輯(道歉)。作爲'module1'的父項目的'myproject'在PYTHONPATH – bcoughlan

回答

1

from myproject.module1.b import Something是做到這一點的最好辦法。它可能有點冗長,但它是明確的,這在Pythonic代碼中通常是理想的質量。

+1

雖然Freaky Dug和@Evert都是正確的,但這是基於[PEP8風格指南](http://www.python.org/dev/peps/pep-0008/)的更好的解決方案:「內部相對導入-package進口是非常不鼓勵的。始終對所有進口使用絕對包路徑「 – bcoughlan

1

您可以嘗試relative imports,a.py,例如,

from .b import Something 

但是,這可能不是您的問題的完整解決方案。與目錄結構的更高級別中的任何模塊/程序包import一樣,您必須小心如何運行它。具體來說,運行一個模塊爲python submodule.py隱式設置模塊的__name__變量爲"__main__"。由於導入(相對和絕對)取決於__name__PYTHONPATH,所以直接運行子模塊可能會導致導入行爲不同(或者與您的情況相同)。

嘗試運行您的tests.py

python myproject/module1/test/test.py 

從包裝而不是直接運行它的最高水平。