pytest与另一个版本的python一起运行

时间:2016-11-21 11:13:04

标签: python linux pytest pyenv

我安装了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
  ================================================== ==================测试会话开始============================= =======================================
  平台linux2 - Python 2.7.6,pytest-3.0.3,py-1.4.31,pluggy-0.4.0 - / usr / bin / python

为什么pytest在旧版本下运行?

3 个答案:

答案 0 :(得分:6)

底线:运行

  • python -m pytest
  • py.test-<version>如果您的替代Python和pytest与系统软件包管理器一起安装,或
  • 如果您的替代Python已与pyenv一起安装,请使用pyenv切换到该版本,确保为其安装了pytest。然后你可以运行pytest
    • 由于pip可执行文件也是正在切换的可执行文件,因此您需要在安装 pytest之前切换到备用Python

正如我所看到的,/usr/bin/pytest(属于系统包管理器&#39; s python-pytest包)有一个shebang !#/usr/bin/python,因为它对应于系统python&#39;安装。

pyenvas its README.md says,不会取代/usr/bin/python - because it indeed should not be replaced to avoid breaking system packages

相反,它将其目录添加到PATH并在那里插入一个启动器(称为&#34; shim&#34;),这是在您输入&#34; {{时调用的内容1}}&#34 ;.正如你可能猜到的那样,这个hack被像上面的shebang所忽略 - 应该如此。

  • 正在运行python将使自身启动的python -m pytest使用其安装中的软件包。
  • 或者,对于您的其他Python版本,python可能包含名为pytest的{​​{1}}上的版本化可执行文件(例如PATHpy.test-<version>),具体取决于方式你安装了它。
    • 如果它来自系统包管理器的非标准python软件包 - 如py.test-3 - 这几乎可以保证。
    • 我检查过如果您安装的版本为py.test-3.6,它只会创建一个无版本的可执行文件(尽管您可以自己创建一个版本化的版本)。此外,如果您为不同的Python版本安装相同的软件包但使用相同的python36-pytest,它将覆盖现有的可执行文件!
  • pip的建议方式seems to be--prefix下为他们安装所有pyenv感兴趣的包。
    • 这不适用于系统的Python,但可以使用默认的python
    • 切换到其他Python版本后,它声称为所有脚本(包括~/.pyenv/versions!)创建了shims,这些脚本当前已为该版本安装 ,因此在没有路径的情况下调用这些脚本会运行这些填充程序。
      • 因此,如果没有为替代版本安装软件包(及其脚本),而是为系统版本安装,则尝试运行其可执行文件将会导致#34;仅使用您现在看到的结果/usr/local

答案 1 :(得分:1)

我搜索互联网并找到the related question。那家伙用以下方式解决:

python -m pytest tests/my_test.py

请告诉我这是否有效:)

答案 2 :(得分:0)

我只是想为Python 2.7运行“黑色”,但是我已经在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 "$@"