pytest与另一个版本的python一起运行

Mey*_*sam 7 python linux pytest pyenv

我已安装pyenv并安装了不同版本的python:

$ pyenv versions
  system
  2.7.1
  3.2.5
  3.5.0
  3.5.1
* 3.5.2
Run Code Online (Sandbox Code Playgroud)

我使用以下命令切换到python 3.5.2:

pyenv shell 3.5.2

当我检查python版本时,这就是我得到的:

$ python --version
Python 3.5.2
Run Code Online (Sandbox Code Playgroud)

但是当我跑步时pytest,它仍然运行在python 2.7.6:

pytest -v
=============================================== =====================测试会话开始========================== ==========================================
platform linux2 - Python 2.7.6 ,pytest-3.0.3,py-1.4.31,pluggy-0.4.0 - /usr/bin/python

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

lin*_*gta 12

我发现了这个相关问题。对于他们来说,它是这样工作的:

python -m pytest tests/my_test.py
Run Code Online (Sandbox Code Playgroud)

我希望它有效


iva*_*eev 8

底线:跑

  • 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" 时调用的.正如你可能猜到的那样,这个hack被上面的shebang忽略了 - 就像它应该的那样.

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

  • @Meysam意味着你没有为_both_版本的python安装`pytest`(你需要单独进行,你知道). (2认同)