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

New*_*Guy 5 python pytest pathlib visual-studio-code

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

\n\n

我有一个这样的目录结构:

\n\n
my_app\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 env\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 bin\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 include\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 lib64 -> lib\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pyvenv.cfg\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 share\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 my_app\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 expected_results\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 test_data\n\xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 tests\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 pytest.ini\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 README.rst\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 setup.cfg\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 setup.py\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n
pytest\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是,当 VSCode 启动时,它会抛出一个错误,指出找不到所需的文件:

\n\n
E   FileNotFoundError: [Errno 2] No such file or directory: \'my_app/expected_results/expected_available_items.yml\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
python -m pytest\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
import pathlib\nEXPECTED_RESULTS_BASE = pathlib.Path("my_app/expected_results")\nexpected_results = EXPECTED_RESULTS_BASE.joinpath(\'expected_available_items.yml\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

我希望可以安全地假设 VSCode 会my_app像我一样从根部启动它?

\n

Sha*_*non 6

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

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

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

您应该能够通过查看文件顶部的 hashbang 来检查 pytest 正在调用哪个 python 版本

head -1 $(which pytest)
Run Code Online (Sandbox Code Playgroud)

在我的系统(安装了 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
Run Code Online (Sandbox Code Playgroud)

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

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