2012-04-28 106 views
3

我工作的一個Python項目大約如下佈局如何處理相對進口Python包

project/ 
    foo/ 
     __init__.py 
     useful.py 
     test/ 
      __init__.py 
      test_useful.py 

test_useful.py嘗試導入project.foo.useful因此它可以測試它,但是當我說「python project/foo/test/test_useful.py」時它不起作用,但是如果我將它複製到我的當前目錄並運行「python test_useful.py」,它就會工作。

發展中處理這些進口的正確方法是什麼?看起來安裝後這不會成爲問題,因爲它會在PYTHONPATH中。我應該使用distutils來創建一個build /文件夾並將其添加到我的PYTHONPATH中嗎?

回答

0

首先,您需要設置您的PYTHONPATH以包含「項目」或「項目」的父項。這一點很重要,當你發展太快:-)

那麼你應該能夠使用絕對導入:

from project.foo import useful 

其次,我建議,而不是通過執行模塊運行測試,你安裝py.test(pip install pytest)。那麼只要你的py.test調用足夠通用(即「py.test foo」可以工作,但是「py.test foo/test/test_useful.py」不會),你就可以使用相對導入。我仍然建議您在測試中使用相對導入而不是

0

請考慮使用distutils/setuptools使您的項目以Python標準方式安裝。 (提示:您需要創建一個與'foo'目錄平行的setup.py文件,也稱爲軟件包。)

這樣做也可以讓您使用一些常見的Python測試框架(鼻子,py.test等),以便能夠收集和運行測試,其中大多數這樣的框架在運行測試之前自動確保'foo'是可導入的包。你的test_useful.py測試可以導入'foo.useful'而不會有任何問題。

從你的示例目錄結構中還值得注意的是,它似乎通常建議你的測試目錄不是Python包。即刪除測試/ init .py文件。該框架將確保測試是可運行的,而不是將其作爲一個軟件包來確保它只能在源代碼分發中分發,而不是二進制分發(可能不需要它)。