27

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

4

3 回答 3

27

底线:跑

  • python -m pytest, 或者
  • py.test-<version>如果您的替代 Python 并pytest安装了系统包管理器,或者
  • 如果您的替代 Python 已安装,请pyenv切换pyenv到该版本确保您已pytest安装它。然后你就可以运行了pytest
    • 由于可执行文件也在被切换的可执行文件中,因此您也需要在安装之前pip切换到替代 Python 。 pytest

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

我搜索互联网并找到相关问题。那家伙通过以下方式工作:

python -m pytest tests/my_test.py

请告诉我这是否有效:)

于 2016-11-21T11:50:10.353 回答
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 "$@"
于 2020-11-07T13:23:45.953 回答