关于python:pytest集成 – 如何正确导入

pytest integration - how to properly import

我正在使用py.test测试我的python代码。我的项目的相关结构是

1
2
3
4
5
6
7
8
9
10
11
12
-myproject
    file.py
    file2.py
    -test/
        input.txt
        input2.dat
        test_part.py
    -regress/
        file2_old.py
        __init__.py
        -test/
            test_file2_regression.py

test_part.py进口filefile2test_file2_regression.py进口file2regress.file2_old。如果我在控制台中运行pytest,我会得到导入错误,即包不存在。另一方面,运行python -m pytest非常好,但是只有从myproject/目录运行它。

正确的方法是什么,让它在我的项目中的任何地方工作?我已经尝试过修改PYTHONPATH,但我真的不知道如何正确地进行修改。

更多信息:

我没有任何设置文件,我的__init__只是空文件。如果有必要操纵PYTHONPATH,则需要相对于myproject进行操作,因为我在多台机器上使用它。我在运行python 2.7。

我已经退房了:

  • 使用pytest正确导入
  • 良好的集成实践

但这对我没什么帮助。


与来自项目中任何目录的pytest命令一起使用的解决方案是在导入到test*.py文件之前包括:

1
2
3
4
import os
from sys import path
PATH = os.path.abspath(os.path.dirname(__file__))
path.append(os.path.join(PATH, os.pardir, os.pardir))

如果使用适当数量的os.pardir导航到项目目录,那么__init__.py文件允许导入模块。

argv[0]inspect.getsourcefile都没有提供必要的信息。argv[0]包含所用py.test模块的位置,getsourcefile方法只返回None


在寻找"最佳方法"的过程中,我遇到了同样的问题,也取得了类似的成功,因此我决定尽可能避免这种情况(从顶层运行实际的脚本),但为了回答您的问题,我目前的方法(例如从并行文件夹进行单元测试)是

1
2
3
from sys import argv, path
from os.path import dirname, join
path.append(join(dirname(argv[0]),".."))

这使得解释器也可以搜索上面启动脚本的文件夹。另一种方法(而不是使用argv)是使用introspect模块获取文件名。这些对我来说比使用__file__更好,因为后者并不总是被定义的。

编辑29.10.:替代argv[0]的方法是使用

1
2
3
4
5
6
from inspect import getsourcefile
from sys import path
from os.path import dirname, join

this_file = getsourcefile(lambda _: None)
path.append(join(dirname(this_file),".."))

我希望这至少可以用于所请求的目的,另请参见如何在python中获取当前执行文件的路径?.

最简单的——如果在你的情况下有效——当然是:

1
2
from os.path import dirname, join
path.append(join(dirname(__file__),".."))