pytest 运行 python 的另一个版本

pytest running with another version of python

我已经安装了 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
==================================================================== test session starts ====================================================================
platform linux2 -- Python 2.7.6, pytest-3.0.3, py-1.4.31, pluggy-0.4.0 -- /usr/bin/python

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

我在 Internet 上搜索并找到 the related question。那个人用以下方式解决问题:

python -m pytest tests/my_test.py

请告诉我这是否有效:)

底线:运行

  • 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, as its README.md says, does not replace /usr/bin/python - because it indeed should not be replaced to avoid breaking system packages.

相反,它将其目录添加到 PATH 并在那里插入一个启动器(称为“shim”),当您键入“python”时将调用它。正如您可能猜到的那样,像上面这样的 shebang 会忽略这个 hack - 它应该如此。

  • 运行 python -m pytest 将使任何启动自身的 python 使用其安装的包。
  • 或者,pytest 对于您的其他 Python 版本可能包括 PATH 上名为 py.test-<version> 的版本化可执行文件(例如 py.test-3py.test-3.6) 取决于你安装它的方式。
    • 如果它来自系统包管理器的非标准包 python - 比如 python36-pytest - 这几乎是有保证的。
    • 我检查过,如果您安装带有 pip 的版本,它只会创建一个未版本化的可执行文件(尽管您可以自己创建一个版本化的可执行文件)。此外,如果您为不同的 Python 版本安装相同的包,但使用相同的 --prefix,它将覆盖现有的可执行文件!
  • pyenv 的建议方式 seems to be 安装所有 python 感兴趣的版本 软件包 ~/.pyenv/versions .
    • 这不适用于系统的Python,但可以使用默认的/usr/local
    • 一旦您切换到另一个 Python 版本,它声称会为 所有 脚本(包括 pip!)创建 shims当前安装了那个版本,所以调用那些没有路径的脚本会运行那些垫片。
      • 因此,如果一个软件包(及其脚本)不是为替代版本安装而是为系统版本安装,尝试 运行 其可执行文件将 "fall through" 到 /usr/local就是您现在看到的结果。

我只是想运行为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 "$@"