【问题标题】:pytest running with another version of pythonpytest 与另一个版本的 python 一起运行
【发布时间】:2017-04-04 18:22:15
【问题描述】:

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

【问题讨论】:

  • which pythonwhich pytest 显示什么?指向的文件是链接还是一些启动器脚本?您也可以尝试hash -r 来消除陈旧bash 路径缓存的情况。
  • @ivan_pozdeev which python => /home/meysam/.pyenv/shims/python - which pytest => /usr/local/bin/pytest
  • which 中得知python 在您的环境中使用python 版本,但是pytest 使用全局可用版本,位于/usr/local/... 下。要在虚拟环境中运行 Pytest,首先使用 python -m pip install pytest 安装它,然后运行 ​​python -m pytest

标签: python linux pytest pyenv


【解决方案1】:

我在互联网上搜索并找到the related question。那家伙用以下方法解决问题:

python -m pytest tests/my_test.py

请告诉我这是否有效:)

【讨论】:

  • 我通过运行上面的命令得到这个错误:/home/meysam/.pyenv/versions/3.5.2/bin/python: No module named pytest
  • pytest安装成功了吗?
  • 是的,当我运行它时,我的所有测试都通过了。但它只在python 2.7.6下运行。
  • 使用python -m pip install pytest在环境中安装pytest,然后尝试运行python -m pytest
【解决方案2】:

底线:运行

  • 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的安装。

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

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

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

【讨论】:

  • 我不知道为什么,但是当我运行 python -m pytest 时出现此错误:/home/meysam/.pyenv/versions/3.5.2/bin/python: No module named pytest
  • @Meysam 这意味着你没有为 both 版本的 python 安装 pytest(你需要单独安装,你知道的)。
  • 谢谢。我单独安装了它,现在它可以工作了:)
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-09
    • 2017-03-30
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多