2013-02-15 75 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