如何在Python包中处理相对导入
我正在做一个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”时,它不起作用,但如果我将其
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文件。该框架将确保测试是可运行的,而不将其作为一个包将有助于确保它只在源发行版中分发,而不是在二进制发行版中分发(可能不需要)