2012-04-28 64 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文件。该框架将确保测试是可运行的,而不是将其作为一个软件包来确保它只能在源代码分发中分发,而不是二进制分发(可能不需要它)。