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

2024-05-14 14:41:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个Python项目,其布局大致如下

project/
    foo/
        __init__.py
        useful.py
        test/
            __init__.py
            test_useful.py

试验_有用.py尝试导入project.foo.有用所以它可以测试它,但是当我说“python project/foo/test/test”时它就不起作用了_有用.py,但如果我把它复制到当前目录并运行“python test”就可以了_有用.py". 在

在开发过程中,如何正确处理这些进口产品?似乎这不会是一个问题,一旦安装,因为它将在PYTHONPATH。我应该使用distutils生成一个构建/文件夹并将其添加到PYTHONPATH中吗?在


Tags: 项目pytestproject文件夹fooinit过程
2条回答

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

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

from project.foo import useful

其次,我建议您安装py.测试(pip安装pytest)。那么你就可以使用相对进口,只要你py.测试调用足够通用(即“py.测试foo“会工作的,但是”py.测试foo/测试/测试_有用.py“不会的)。我仍然建议您在测试中使用相对导入。在

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

这样做还可以让您使用许多常见的Python测试框架(nose,py.测试,以使收集和运行测试成为可能,其中大多数这样的框架在运行测试之前自动确保“foo”是一个可导入的包。你的测试_有用.py测试可以导入'很有用“没问题。在

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

相关问题 更多 >

    热门问题