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