我已经安装了pyenv
,并安装了不同版本的python:
$ pyenv versions
system
2.7.1
3.2.5
3.5.0
3.5.1
* 3.5.2
字符串
我使用以下命令切换到python 3.5.2
:
Pyenv shell 3.5.2
当我检查Python版本时,这是我得到的:
$ python --version
Python 3.5.2
型
但是当我运行pytest
时,它仍然在python 2.7.6
下运行:
pytest -v
平台linux 2-- Python 2.7.6,pytest-3.0.3,py-1.4.31,pluggy-0.4.0 -- /usr/bin/python
为什么pytest
在旧版本下运行?
4条答案
按热度按时间ghhkc1vu1#
底线是:跑
python -m pytest
,或py.test-<version>
(如果您的替代Python和pytest
与系统包管理器一起安装),或者pyenv
,用pyenv
切换到那个版本 * 并 * 确保你已经安装了pytest
。然后你可以运行pytest
。pip
可执行文件也是要切换的文件之一,因此在为它安装 *pytest
之前,您也需要切换到替代Python *。正如我所看到的,
/usr/bin/pytest
(属于系统包管理器的python-pytest
包)有一个shebang!#/usr/bin/python
,因为它对应于系统python的安装。pyenv
,正如它的README.md
所说,并不能取代/usr/bin/python
-因为它确实不应该被取代,以避免破坏系统包。相反,它将其目录添加到
PATH
,并在那里插入一个启动器(称为“shim”),当您键入“python
“时会调用该启动器。正如您可能猜到的那样,这种黑客行为会被上面的shebang忽略-正如它应该的那样。python -m pytest
将使自行启动的python
使用其安装中的软件包。pytest
可能包含名为py.test-<version>
(例如py.test-3
或py.test-3.6
)的PATH
上的版本化可执行文件,具体取决于您安装它的方式。python36-pytest
-这几乎是有保证的。pip
的版本,它只会创建一个未版本化的可执行文件(尽管你可以自己创建一个版本化的可执行文件)。此外,如果你安装了一个不同Python版本的相同软件包,但使用相同的--prefix
,它会覆盖现有的可执行文件!pyenv
的建议方式似乎是在~/.pyenv/versions
下为它们安装所有感兴趣的python
版本 * 和 * 包。/usr/local
。pip
!)创建一个脚本,所以调用这些脚本而不带路径将运行这些脚本。/usr/local
,结果就是你现在看到的。moiiocjp2#
我找到了this related question。对他们来说,它与此工作:
字符串
我希望它能起作用
cbeh67ev3#
我只是想在Python 2.7中运行“black”,但我已经在pyenv的Python 3.7.9中安装了它。它与脚本
/usr/local/bin/black27
一起正常工作:字符串
它不工作与:
型
也不
型
cpjpxq1n4#
我在最近运行pytest时遇到了这个问题,原因是我也全局安装了pytest。
这个场景是在虚拟环境处于活动状态时运行
pytest
,你会得到错误,原因是shell在你的$PATH
环境变量中查找pytest
,它在虚拟环境中找到与系统级Python安装相关联的pytest
可执行文件之前找到了pytest
可执行文件。总之,要解决这个问题,通过运行,
字符串
告诉Python使用当前Python环境中安装的
pytest
。顺便说一下,
-m
标志用于将库模块作为脚本运行(执行模块的__main__.py
文件)。