使用 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。因此,在我的默认环境中,pytest
和 python -m pytest
应该对我产生相同的结果。
您确定 VSCode 在 运行 测试之前正确加载了您的 venv 吗?
假设您在 VS Code 中为 Python 解释器选择了一个虚拟环境:
- 在 VS Code 中打开终端
- 让虚拟环境激活
- 运行
python -m pip install pytest
这会将 pytest 安装到虚拟环境中,这就是 python -m
失败的原因(您 PATH 上的全局 pytest 安装在虚拟环境无法访问的某些全局 Python 安装中) .
我最近将我正在使用的 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。因此,在我的默认环境中,pytest
和 python -m pytest
应该对我产生相同的结果。
您确定 VSCode 在 运行 测试之前正确加载了您的 venv 吗?
假设您在 VS Code 中为 Python 解释器选择了一个虚拟环境:
- 在 VS Code 中打开终端
- 让虚拟环境激活
- 运行
python -m pip install pytest
这会将 pytest 安装到虚拟环境中,这就是 python -m
失败的原因(您 PATH 上的全局 pytest 安装在虚拟环境无法访问的某些全局 Python 安装中) .