使用 python -m pytest 与 pytest 时出现 FileNotFoundError

FileNotFoundError when using python -m pytest vs. pytest

我最近将我正在使用的 IDE 更改为 VSCode。大多数情况下我喜欢它,但有一个特殊问题我似乎无法解决。我也没有意识到这是一个问题,直到我移动 IDEs.

我有这样的目录结构:

my_app
├── env
│   ├── bin
│   ├── include
│   ├── lib
│   ├── lib64 -> lib
│   ├── pyvenv.cfg
│   └── share
├── my_app
│   ├── expected_results
│   ├── __init__.py
│   ├── test_data
│   └── tests
├── pytest.ini
├── README.rst
├── setup.cfg
└── setup.py

启动虚拟环境时,我位于该目录结构的根目录下。

我 运行 我通过发出此命令(或提供其他选项)进行测试。这目前有效:

pytest

但是,当 VSCode 启动时,它吐出一个错误,指出找不到预期的文件:

E   FileNotFoundError: [Errno 2] No such file or directory: 'my_app/expected_results/expected_available_items.yml'

经过一些调查,我发现这是因为当 VSCode 启动时发出以下命令:

python -m pytest

我正在通过这样做设置该路径:

import pathlib
EXPECTED_RESULTS_BASE = pathlib.Path("my_app/expected_results")
expected_results = EXPECTED_RESULTS_BASE.joinpath('expected_available_items.yml')

我需要修改什么才能让我的测试在我发出 pytest 命令时继续运行并且在我(或我的 IDE,显然)发出 python -m pytest

我希望可以安全地假设 VSCode 像我一样从 my_app 的根启动这个?

可能没有足够的信息直接为您回答这个问题,但让我们尝试一些事情:

  • 在您的测试代码中,在出现错误的行上方插入一些这样的行,看看它们是否打印出您期望的内容
print(os.getcwd())
print(EXPECTED_RESULTS_BASE.absolute())
  • 由于您使用的是 venv,并且错误是使用不同命令调用 pytest 的结果,请尝试使用 which 看看您是否真的在调用不同的东西。在激活您的 venv 之前和之后:
which pytest
which python

python -m pytest 将调用与您刚刚调用的 python 版本一起安装的 pytest 模块。如果 python 调用的版本与您在 venv 中从 pytest 获得的版本不同,那么这可能就是问题所在。

您应该能够通过查看文件顶部的 hashbang

来检查 pytest 正在调用哪个 python 版本
head -1 $(which pytest)

在我的系统上,安装了 anaconda Python 的 macOS,我从这些命令中得到以下内容

$ which pytest
/Users/Shannon/anaconda/bin/pytest

$ which python
/Users/Shannon/anaconda/bin/python

$ head -1 $(which pytest)
#!/Users/Shannon/anaconda/bin/python

这告诉我 pytest 正在调用与我调用 python 时得到的相同版本的 python。因此,在我的默认环境中,pytestpython -m pytest 应该对我产生相同的结果。

您确定 VSCode 在 运行 测试之前正确加载了您的 venv 吗?

假设您在 VS Code 中为 Python 解释器选择了一个虚拟环境:

  1. 在 VS Code 中打开终端
  2. 让虚拟环境激活
  3. 运行 python -m pip install pytest

这会将 pytest 安装到虚拟环境中,这就是 python -m 失败的原因(您 PATH 上的全局 pytest 安装在虚拟环境无法访问的某些全局 Python 安装中) .