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

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中吗?
2个回答

0

首先,您需要设置PYTHONPATH,将“project”或其父目录包含在内。这在开发过程中非常重要 :-)

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

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标准方式使您的项目可安装。 (提示:您需要创建一个setup.py文件,与“foo”目录并列,也称为包。)
这样做还将使您能够使用许多常见的Python测试框架(nose、py.test等),从而使收集和运行测试成为可能,在大多数这样的框架中,在运行测试之前自动确保“foo”是可导入的包。 您的test_useful.py测试可以轻松导入'foo.useful'。
此外,值得注意的是,从您的示例目录结构中可以看出,通常建议您的测试目录不是Python包。 即删除test/init.py文件。 框架将确保测试可运行,并且不将其作为包分发将有助于确保它仅在源分发中分发,而不是二进制分发(其中可能不需要它)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接