如何处理Python包中的相对导入

时间:2012-04-28 20:53:01

标签: 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制作一个构建/文件夹并将其添加到我的PYTHONPATH吗?

2 个答案:

答案 0 :(得分:0)

首先,您需要将PYTHONPATH设置为包含“project”或“project”的父级。这一点在您开发过程中也很重要: - )

然后你应该可以使用绝对导入:

from project.foo import useful

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

答案 1 :(得分:0)

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

这样做还可以让你使用一些常见的Python测试框架(nose,py.test等)来收集和运行测试,大多数这样的框架会自动确保'foo'是一个在运行测试之前可导入的包。你的test_useful.py测试可以导入'foo.useful'没有问题。

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