linux pytest运行另一个版本的python

pbwdgjma  于 2023-11-17  发布在  Linux
关注(0)|答案(4)|浏览(136)

我已经安装了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在旧版本下运行?

ghhkc1vu

ghhkc1vu1#

底线是:跑

  • python -m pytest,或
  • py.test-<version>(如果您的替代Python和pytest与系统包管理器一起安装),或者
  • 如果你的替代Python已经安装了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使用其安装中的软件包。
  • 或者,您的其他Python版本的pytest可能包含名为py.test-<version>(例如py.test-3py.test-3.6)的PATH上的版本化可执行文件,具体取决于您安装它的方式。
  • 如果它来自非标准python的系统包管理器的包-如python36-pytest-这几乎是有保证的。
  • 我检查过,如果你安装了一个带有pip的版本,它只会创建一个未版本化的可执行文件(尽管你可以自己创建一个版本化的可执行文件)。此外,如果你安装了一个不同Python版本的相同软件包,但使用相同的--prefix,它会覆盖现有的可执行文件!
  • pyenv的建议方式似乎是在~/.pyenv/versions下为它们安装所有感兴趣的python版本 * 和 * 包。
  • 这不适用于系统的Python,但可以使用默认的/usr/local
  • 一旦你切换到另一个Python版本,它会声称为当前安装的 * 所有 * 脚本(包括pip!)创建一个脚本,所以调用这些脚本而不带路径将运行这些脚本。
  • 因此,如果一个包(以及它的脚本)不是为替代版本安装的,而是为系统版本安装的,那么尝试运行它的可执行文件将“失败”到/usr/local,结果就是你现在看到的。
moiiocjp

moiiocjp2#

我找到了this related question。对他们来说,它与此工作:

python -m pytest tests/my_test.py

字符串
我希望它能起作用

cbeh67ev

cbeh67ev3#

我只是想在Python 2.7中运行“black”,但我已经在pyenv的Python 3.7.9中安装了它。它与脚本/usr/local/bin/black27一起正常工作:

PYENV_VERSION=3.7.9 black -t py27 "$@"

字符串
它不工作与:

pyenv shell 3.7.9
black -t py27 "$@"


也不

pyenv shell 3.7.9
pyenv exec black -t py27 "$@"

cpjpxq1n

cpjpxq1n4#

我在最近运行pytest时遇到了这个问题,原因是我也全局安装了pytest。
这个场景是在虚拟环境处于活动状态时运行pytest,你会得到错误,原因是shell在你的$PATH环境变量中查找pytest,它在虚拟环境中找到与系统级Python安装相关联的pytest可执行文件之前找到了pytest可执行文件。
总之,要解决这个问题,通过运行,

python -m pytest

字符串
告诉Python使用当前Python环境中安装的pytest
顺便说一下,-m标志用于将库模块作为脚本运行(执行模块的__main__.py文件)。

相关问题