Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python包中处理相对导入_Python - Fatal编程技术网

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

如何在Python包中处理相对导入,python,Python,我正在做一个Python项目,大致有以下布局 project/ foo/ __init__.py useful.py test/ __init__.py test_useful.py test_-usuble.py尝试导入project.foo.usuble以便对其进行测试,但当我说“python-project/foo/test/test_-usuble.py”时,它不起作用,但如果我将其

我正在做一个Python项目,大致有以下布局

project/
    foo/
        __init__.py
        useful.py
        test/
            __init__.py
            test_useful.py
test_-usuble.py尝试导入project.foo.usuble以便对其进行测试,但当我说“python-project/foo/test/test_-usuble.py”时,它不起作用,但如果我将其复制到当前目录并运行“python-test_-usuble.py”,它会起作用


在发展过程中处理这些进口的正确方法是什么?这似乎在安装后不会成为问题,因为它将在PYTHONPATH中。我应该使用distutils创建一个构建/文件夹并将其添加到我的PYTHONPATH吗?

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

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

from project.foo import useful

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

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

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

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