使用不同名称的 pyenv 设置两个不同的 python 版本?

Set two different python versions with pyenv with different names?

是否可以使用 pyenv 为不同的名称设置两个不同的 python 版本?例如。我希望 python3 引用版本 3.7.4,但 python 引用系统定义的 python 的版本 2,即 2.7.12,因此不会有任何冲突和问题。

目前我只能使用 pyenv global 3.7.4 全局设置版本,这导致 pythonpython3 都是版本 3.7.4。

当您 运行 您的 python 时,最好明确说明。 IE。通过 PYENV_VERSION 环境版本指定你想要的版本。如果你通过 pyenv 安装了 python 2.7.12,你应该能够验证:

PYENV_VERSION=2.7.12 python -V

如果您决定 运行 具有相同 python 版本的多个项目,您确实应该创建一个新的 virtualenv 以确保您不会 运行 陷入任何依赖性问题。 Pyenv 有一个 plugin 支持这个。然后你可以这样做:

pyenv virtualenv 2.7.12 python2-env
pyenv virtualenv 3.7.4 python3-env

然后您可以通过以下方式激活您的 shell:

pyenv shell python3-env

在这种情况下 python 将指向 3.7.4 填充程序。

或者:

pyenv shell python2-env

在这种情况下 python 将指向 2.7.12 填充程序。 (你可以随意调用这些 virtualenvs,我只是以 python2-env 和 python3-env 为例。)

如果你真的打算使用 python3 和 python,你总是可以在你的 .bashrc 中设置一个别名:

alias python3='PYENV_VERSION=3.7.4 python'
alias python='PYENV_VERSION=2.7.12 python'

我知道这个问题很久以前就有了,但我偶然发现了同样的问题,下面是我采用的方法。

为了确保我们在同一页面上...

最初,我(我假设你也是)pythonpython3 都指向系统的 Python:

$ pyenv versions
* system (set by /home/nigorojr/.pyenv/version)
  3.7.4
$ python --version && pyenv which python
Python 2.7.12
/usr/bin/python
$ python3 --version && pyenv which python3
Python 3.5.2
/usr/bin/python3

然而,这就是我想要的:

$ python --version && pyenv which python
Python 2.7.12
/usr/bin/python
$ python3 --version && pyenv which python3
Python 3.7.4
/home/nigorojr/.pyenv/versions/3.7.4/bin/python3

方法

我采用的方法与@Kapitol 的第二个建议类似。但是,我创建了一个 shell 脚本而不是别名,因为我希望其他命令(包括 pyenv)能够找到我的新 python3 命令。

我创建了 ~/bin/python3(我的 $PATH 变量中有 ~/bin),内容如下:

#!/bin/sh

# PYENV_VERSION="$( pyenv versions | tr -d ' ' | awk '/^3\./ { print  }' | tail -n 1 )" pyenv exec python3 $@
# Or simply,
PYENV_VERSION="3.7.4" pyenv exec python3 $@

使用这个 shell 脚本,我得到:

$ python --version && pyenv which python
Python 2.7.12
/usr/bin/python
$ python3 --version && pyenv which python3
Python 3.7.4
/home/nigorojr/bin/python3

注1:在shell脚本中使用exec python3 $@代替pyenv exec python3 $@不起作用,因为它变成了对脚本本身的无限递归调用(取决于$PATH).使用 pyenv exec 可确保无论 $PATH 变量如何排序,pyenv Python 都会被调用。

注意 2:让所有获取最新版本的管道都由 pyenv 管理确实会在调用 python3 时减慢启动速度。因此,如果您有想要使用的特定版本,我建议您在 PYENV_VERSION 中简单地设置您想要的 Python 版本。

注意 3:请注意,pip3 和其他命令将无法通过此方法找到。一种解决方案是为您使用的每个命令创建一个 shell 脚本。另一种解决方法是运行pyenv global system 3.7.4这样如果系统没有安装命令pyenv可以在3.7.4中搜索

检查它是否有效

为了确保一切都按预期工作,我编写了以下 Python 脚本:

#!/usr/bin/env python

import sys
print(sys.version)

和运行:

$ ./sample.py
2.7.12 (default, Oct  8 2019, 14:14:10)
[GCC 5.4.0 20160609]
$ python ./sample.py
2.7.12 (default, Oct  8 2019, 14:14:10)
[GCC 5.4.0 20160609]
$ python3 ./sample.py
3.7.4 (default, Sep 16 2019, 16:09:11)
[GCC 5.4.0 20160609]

将第一行改为#!/usr/bin/env python3,我得到:

$ ./sample.py
3.7.4 (default, Sep 16 2019, 16:09:11)
[GCC 5.4.0 20160609]
$ python ./sample.py
2.7.12 (default, Oct  8 2019, 14:14:10)
[GCC 5.4.0 20160609]
$ python3 ./sample.py
3.7.4 (default, Sep 16 2019, 16:09:11)
[GCC 5.4.0 20160609]

总而言之,通过上述方法,您可以让 python 指向系统的 Python 2,同时让 python3 指向安装了 pyenv 的版本。

Pyenv 允许您使用 "advanced" 模式

同时使用不同版本的 Python

文档中的示例:

$ pyenv local 2.7.6 3.3.3
$ pyenv versions
  system
* 2.7.6 (set by /Users/yyuu/path/to/project/.python-version)
* 3.3.3 (set by /Users/yyuu/path/to/project/.python-version)
$ python --version
Python 2.7.6
$ python2.7 --version
Python 2.7.6
$ python3.3 --version
Python 3.3.3

更多信息请查看: https://github.com/pyenv/pyenv/blob/master/COMMANDS.md#pyenv-local-advanced