2010-07-14 75 views
1

我有一個這樣的目錄struture:問題與Python包和測試

project 
| __init__.py 
| project.py 
| src/ 
    | __init__.py 
    | class_one.py 
    | class_two.py 
| test/ 
    | __init__.py 
    | test_class_one.py 

其中project.py只是實例ClassOne並運行它。

我的問題是在測試中,我不知道如何導入src類。我試圖導入這些方法,我得到了什麼:

from project.src.class_one import ClassOne 

from ..src.class_one import ClassOne 

我在做什麼錯?有更好的目錄結構嗎?

----- -----編輯

我改變了我的目錄結構,它現在是這樣的:

Project/ 
| project.py 
| project/ 
    | __init__.py 
    | class_one.py 
    | class_two.py 
    | test/ 
     | __init__.py 
     | test_class_one.py 

而在test_class_one.py文件我想以這種方式導入:

from project.class_one import ClassOne 

而且它仍然不起作用。我沒有在bin目錄中使用可執行文件project.py,因爲我無法從更高級目錄中導入軟件包。 :(

感謝= d

+0

當您運行測試時,您有哪些目錄? – bstpierre 2010-07-14 23:52:35

+0

在測試目錄中,這是錯誤的嗎? = P – CrociDB 2010-07-14 23:57:40

回答

1

這一切都取決於你的Python路徑。實現您想要在此處執行的最簡單方法是將PYTHONPATH環境變量設置爲「項目」目錄所在的位置。例如,如果你的來源是生活在:

/Users/crocidb/src/project/ 

我想:

export PYTHONPATH=/Users/crocidb/src 

然後在test_one.py我能:

import project.src.class_one 

其實我可能會做這樣:

export PYTHONPATH=/Users/crocidb/src/project 

和th這在test_one中。py:

import src.class_one 

但這只是我的偏好,真的取決於你的層次結構的其餘部分。還要注意的是,如果你已經在PYTHONPATH東西你要添加到它:

export PYTHONPATH=/Users/crocidb/src/project:$PYTHONPATH 

或其他命令,如果你想成爲最後搜查你的項目路徑。

這一切都適用於Windows,除非您需要使用windows的語法來設置環境變量。

+0

更多信息:http://docs.python.org/tutorial/modules.html#the-module-search-path – devguydavid 2010-07-14 23:56:27

+0

它的工作!我只需將我的項目的目錄添加到PYTHONPATH中。謝謝。 = d – CrociDB 2010-07-15 00:32:58

0

Jp Calderone's excellent blog post

務必:例如,如果你的 項目被命名爲「

  • 名稱目錄的東西與你的項目。 Twisted「,將 頂級目錄命名爲其源 文件Twisted。當您執行發行版時, 應包含版本號er 後綴:Twisted-2.5。
  • 創建一個目錄Twisted/bin並將您的可執行文件放在那裏,如果你有 有任何問題。不要給他們一個.py 擴展名,即使他們是Python 源文件。不要在 中放置任何代碼,除了在項目中導入並呼叫 主函數定義的其他地方 。 (輕微的皺紋: 因爲在Windows中,解釋是 通過文件擴展名選擇,您 Windows用戶真正做到想的.py 延長所以,當你打包 Windows,則可能需要添加它 可惜。有沒有簡單的 distutils的把戲,我所知道的 自動完成這一過程。考慮 上POSIX .py擴展名是 只疣,而在Windows上 缺乏確實是個bug,如果你的 的用戶羣包括Windows用戶,你可能想選擇在任何地方擴展.py 。)
  • 如果您的項目可作爲單個Python源文件表達,則將其 放入該目錄中,並將其命名爲 與您的項目相關的內容。例如,對於 Twisted/twisted.py。如果您的 需要多個源文件,請創建一個 包(而不是Twisted/twisted /, ,其中包含一個空的 Twisted/twisted/__ init__.py),並將 源文件放入其中。例如, Twisted/twisted/internet.py。
  • 把你的單元測試在程序包中的子包(注 - 這意味着 ,單一Python源文件 選項上面是一招 - 你總是 需要您 單元測試至少一種其他文件)。例如, 扭曲/扭曲/測試/。當然,製作 它包含 Twisted/twisted/test/__ init__.py。 將測試放在 Twisted/twisted/test/test_internet.py等文件中。
  • 添加Twisted/README和Twisted/setup.py來解釋和 分別安裝您的軟件, ,如果你感覺不錯。

不要:

  • 把你的源目錄中名爲src或庫。這使得難以運行 而無需安裝。
  • 把你的測試放到你的Python包之外。這使得 難以針對已安裝的 版本運行測試。
  • 創建一個僅包含__init__.py的包,然後將所有代碼放入__init__.py。只需製作一個模塊 而不是一個包,它更簡單。
  • 嘗試拿出神奇的黑客,才能使Python能夠導入模塊 或包,而無需用戶將其包含到他們的 導入路徑的目錄(通過PYTHONPATH或 其他一些機制)添加 。您不會 正確處理所有情況,並且當您的 軟件不能在其環境中工作時,用戶 會對您生氣。
+0

不錯的提示,但我仍然有問題導入更高級別的軟件包。 – CrociDB 2010-07-14 23:29:15