`python -m pytest`和virtualenv中的`pytest`有什么区别?

4
在我的旧虚拟环境中,我可以直接执行pytest tests/unit/命令。然后不知怎么的,我的环境出了问题,我不得不删除并重新安装.venv。接着,在激活新的.venv并重新安装所有包之后,我尝试执行pytest tests/unit/命令,但是它会出现以下错误:
(.venv) john@MacBook-Pro:~/myproject$ pytest tests/unit/nti/ -p no:warnings 
-bash: /usr/local/bin/pytest: /usr/local/opt/python/bin/python3.6: bad interpreter: No such file or directory

在经历了一些痛苦的尝试后,我发现可以通过以下方式运行测试:

(.venv) john@MacBook-Pro:~/myproject$ python -m pytest tests/unit/nti/ -p no:warnings

那么,python -m pytestpytest之间有什么区别呢?为什么pytest无法工作,但python -m pytest却可以正常运行?


3
pytest 尝试将模块作为脚本本身运行,使用顶部的 shebang(!#... 行)来决定使用哪个解释器。python -mpytest 仅使用 python 运行模块,忽略 shebang。问题似乎是您的计算机上不再存在 /usr/local/opt/python/bin/python3.6 - chepner
但是它在旧的virtualenv中是如何工作的呢...我按照设置旧的virtualenv相同的步骤设置了新的virtualenv。有没有办法让它在新的virtualenv中工作? - Kid_Learning_C
我也觉得这很令人困惑,因为which pythonwhich pytest都指向项目venv文件夹内的二进制文件。对于python -m pytestPATH包含来自项目目录的模块,但是只有纯粹的pytest失败,因为它们不在PATH上。 - Tobias Feil
1个回答

3

可能的一个选项是你的'tests'目录里面没有 __init__.py 文件,所以你必须显式地调用 pytest 模块 (python -m pytest)。 这对我来说在 Debian 10、Python 3.7.3 虚拟环境和 pytest 6.2.3 上有所改变。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接