使用另一个版本的python运行pytest

使用另一个版本的python运行pytest,python,linux,pytest,pyenv,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外壳3.5.2 当我检查python版本时,我得到的是: $ python --version Python 3.5.2 但是当我运行pytest时,它仍然在python2.7.6下运行: pytest-v ====================

我已经安装了
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
时,它仍然在
python2.7.6
下运行:

pytest-v
===========================================================================================测试会话开始==============================================================================================================================================================================================================
平台linux2--Python2.7.6、pytest-3.0.3、py-1.4.31、pluggy-0.4.0--/usr/bin/Python


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

我在互联网上搜索并找到。那家伙的工作方式如下:

python -m pytest tests/my_test.py
请告诉我这是否有效:)

底线:运行

  • python-m pytest
    ,或
  • py.test-
    如果您的替代Python和
    pytest
    安装了system package manager,或者
  • 如果您的替代Python已安装了
    pyenv
    ,请使用
    pyenv
    切换到该版本,并确保已为其安装了
    pytest
    。然后您可以运行
    pytest
    • 由于
      pip
      可执行文件也在被切换的可执行文件中,因此在为其安装
      pytest
      之前,您也需要切换到替代Python

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

pyenv
,不替换
/usr/bin/python
-

相反,它将其目录添加到
PATH
,并在那里插入一个启动器(称为“”),当您键入“
python
”时,将调用该启动器。正如你可能猜到的那样,这种黑客行为被上面提到的一个shebang忽略了——这是应该的

  • 运行
    python-m pytest
    将使启动自身的
    python
    使用其安装的包
  • 或者,其他Python版本的
    pytest
    可能在名为
    py.test-
    (例如
    py.test-3
    py.test-3.6
    )的
    路径上包含版本化的可执行文件,具体取决于安装方式。
    
    • 如果它来自非标准python的系统包管理器包(如
      python36-pytest
      ),这几乎是可以保证的
    • 我检查过,如果您安装的版本带有
      pip
      ,它只会创建一个未版本化的可执行文件(尽管您可以自己创建一个版本化的可执行文件)。此外,如果为不同的Python版本安装相同的软件包,但使用相同的
      --前缀
      ,它将覆盖现有的可执行文件
      
  • pyenv
    的建议方法是在
    ~/.pyenv/versions
    下安装所有感兴趣的
    python
    版本及其软件包。
    • 这不适用于系统的Python,但可以使用默认的
      /usr/local
    • 一旦您切换到另一个Python版本,它会声明为当前为该版本安装的所有脚本(包括
      pip
      !)创建脚本,因此在没有路径的情况下调用这些脚本将运行这些脚本。
      • 因此,如果一个包(以及它的脚本)不是为替代版本安装的,而是为系统版本安装的,那么尝试运行它的可执行文件将“失败”到
        /usr/local
        ,结果就是您现在看到的结果
我只想为Python2.7运行“black”,但我已经将其安装在pyenv的Python3.7.9中。它使用脚本
/usr/local/bin/black27时工作正常:

PYENV_VERSION=3.7.9 black -t py27 "$@"
它不适用于:

pyenv shell 3.7.9
black -t py27 "$@"
也不是


哪个python
哪个pytest
显示了什么?是指向文件链接还是某些启动程序脚本?您还可以尝试
hash-r
来消除过时的
bash
路径缓存。@ivan_pozdeev
哪个python
=>
/home/meysam/.pyenv/shimmes/python
-
哪个pytest
/usr/local/bin/pytest
我通过运行上述命令获得此错误:
/home/meysam/.pyenv/versions/3.5.2/bin/python:没有名为pytest的模块
您成功安装了pytest吗?是的,我运行pytest时所有的测试都通过了。但是它只在
python2.7.6下运行。我不知道为什么,但是当我运行
python-m pytest
时,我得到了这个错误:
/home/meysam/.pyenv/versions/3.5.2/bin/python:没有名为pytest的模块
@meysam,这意味着你没有为两个版本的python安装
pytest
(你知道,需要单独安装)。谢谢。我单独安装了它,现在它可以工作了:)
pyenv shell 3.7.9
pyenv exec black -t py27 "$@"