python - pytest 集成 - 如何正确导入

标签 python python-import pytest

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

-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。


我已经 checkout :

但这并没有真正帮助我。

最佳答案

在项目的任何目录中使用 pytest 命令的解决方案是在导入之前包含在 test*.py 文件中:

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


编辑:从 Python 3.4 开始,我们可以使用现代 pathlib 代替 os.path:

from pathlib import Path
from sys import path

PATH = Path(__file__).resolve()
path.append(PATH.parents[2])

关于python - pytest 集成 - 如何正确导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40318805/

相关文章:

python - django redirect inside urls.py

python - 如何将多个文件移动并重命名到特定文件夹?

python - "from package import *"和 "import package"之间的性能

python - 如何确保只有在 pytest 中明确要求时才运行带有标记的测试?

Python 日期范围查询

python - 我在 python 中遇到一个问题,即用句子的行结束字符分割文本的一部分

python - 如何更改 python 的 "full name"(类似 `cpython-34m-x86_64-linux-gnu` )?

python - 从具有相同名称的脚本导入已安装的包引发 "AttributeError: module has no attribute"或 ImportError 或 NameError

python - 为 celery 任务编写测试时出错

python - 我如何断言列表与 pytest 相等