3

我正在开发一个 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 吗?

4

2 回答 2

0

请考虑使用 distutils/setuptools 使您的项目可以以 Python 标准方式安装。(提示:您需要创建一个与 'foo' 目录平行的 setup.py 文件,也称为包。)

这样做还允许您使用许多常见的 Python 测试框架(nose、py.test 等)来收集和运行测试,其中大多数此类框架会自动确保 'foo' 是一个可导入的包运行测试。您的 test_useful.py 测试可以毫无问题地导入“foo.useful”。

从您的示例目录结构中还值得注意的是,似乎通常建议您的测试目录不是 Python 包。即删除 test/ init .py 文件。该框架将确保测试是可运行的,并且不将其作为一个包将有助于确保它仅在源发行版中分发,而不是在二进制发行版中(可能不需要它的地方。)

于 2012-04-28T23:16:53.113 回答
0

首先,您需要将 PYTHONPATH 设置为包含“项目”或“项目”的父级。这在您开发时也很重要:-)

然后你应该能够使用绝对导入:

from project.foo import useful

其次,我建议不要通过执行模块来运行测试,而是安装 py.test (pip install pytest)。然后,您将能够使用相对导入,只要您的 py.test 调用足够通用(即“py.test foo”可以工作,但“py.test foo/test/test_useful.py”不会)。我仍然建议您不要在测试中使用相对导入。

于 2012-04-28T21:19:00.413 回答