2013-02-15 72 views
0
packageName\ 
    __init__.py 
    src\ 
     __init__.py 
     someFile.py 
     classes\ 
      __init__.py 
      engine1.py 
      engine2.py 
      engine.py 
    tests\ 
     __init__.py 
     myTests.py 
    temp\ 

我正在使用Python的OOP,我有幾個問題。構建Python OOP代碼和模塊

據我所知,__init__.py將文件夾定義爲一個模塊,但我不明白的是這對我有什麼好處。

如果需要從packageName/src/classes文件夾導入類,我該如何運行myTests.py

$ python packageName/tests/myTests.py 

上面的調用是我想我打算如何運行我的測試。如果結構是這種情況,我如何導入類?

from ..src.classes.engine1 import * 
+1

我強烈建議你閱讀[漫遊指南包裝1.0 - 佈置您的項目(http://guide.python-distribute.org/quickstart的.html#佈局設計,你的項目)。如果你把你的項目組織成一個合適的包並安裝它,你將能夠在系統的任何地方使用絕對導入(例如:'from src.classes.engine1 import something')。此外,我強烈建議您避免使用'import *'語句......它們會污染模塊的命名空間並導致各種不尋常的問題。 – 2013-02-15 23:24:39

+1

將'__init __。py'文件添加到文件夾使其成爲其他模塊(和/或子包)的_package_,而不是模塊本身。 – martineau 2013-02-16 03:25:14

回答

0

正如@Mike提到的那樣,「打包旅遊者指南」將是一個很好的起點。

現在,就您的測試而言:出於各種原因,您不能只運行python packageName/tests/myTests.py(具體來說,Python會對包佈局感到困惑 - 當您運行python foo.py的文件時,它預計會在包,所以from ..src …線路將失敗,Attempted relative import in non-package)。

相反,你需要從啓動測試外包...或者使用一個測試運行像noseunittest2,還是在頂級目錄編寫一個簡單的腳本(即高於packageName/):

$ ls 
packageName/ run_tests 
$ cat run_tests.py 
from packageName.tests.myTests import main 
main() 

然後把main()功能放在myTests()

但是,使用測試運行器要簡單得多。如果你已經written your tests correctly,你可以運行它們:

$ ls 
packageName/ 
$ nosetests 
.................................. 
---------------------------------------------------------------------- 
Ran 34 tests in 1.440s 

OK