使用 pyenv 管理 Python 版本

转自使用 pyenv 管理 Python 版本 ,略有修改。

前言

在使用python的时候,我们经常被python项目混乱的版本以及复杂的包依赖搞得头晕脑胀,但是自从有了pyenv和anaconda(python包虚拟环境,包依赖),一切都清晰明了了。

pyenv 是 Python 版本管理工具。 pyenv 可以改变全局的 Python 版本,安装多个版本的 Python, 设置目录级别的 Python 版本,还能创建和管理 virtual python environments 。所有的设置都是用户级别的操作,不需要 sudo 命令。

pyenv 主要用来管理 Python 的版本,比如一个项目需要 Python 2.x ,一个项目需要 Python 3.x 。 而 anaconda 主要用来管理 Python 包的依赖,不同项目需要依赖的包版本不同,则需要使用虚拟环境。

pyenv 通过系统修改环境变量来实现 Python 不同版本的切换。而 anaconda 通过将 Python 包安装到一个目录来作为Python 包虚拟环境,通过切换目录来实现不同包环境间的切换。

pyenv 的美好之处在于,它并没有使用将不同的 PATH 植入不同的Shell这种高耦合的工作方式,而是简单的在 PATH 的最前面插入了一个垫片路径(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。所有对 Python 可执行文件的查找都会首先被这个 shims 路径截获,从而使后方的系统路径失效。

pyenv安装

具体的安装方式参照 官网

  • centos自动安装

    1
    2
    # curl https://pyenv.run | bash
    # exec $SHELL # Restart your shell so the path changes take effect
  • centos手动下载安装
    在服务器环境中,发现使用上一种方式经常不好使,网络无法链接,所以采用以下这种方式,

    1
    2
    3
    4
    5
    6
    $ git clone https://github.com/pyenv/pyenv.git ~/.pyenv
    $ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
    $ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile

    $ echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n eval "$(pyenv init -)"\nfi' >> ~/.bash_profile
    $exec "$SHELL"

我这里是Mac,推荐使用brew安装。
安装成功之后,在.bashrc 或者 .bash_profile 中添加三行来开启自动补全.

1
2
3
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

pyenv 常用命令

使用 pyenv commands 显示所有可用命令

  • 查看本机安装 Python 版本

    1
    pyenv versions
  • 查看可安装 Python 版本

    1
    pyenv install -l
  • python 安装与卸载

    1
    2
    $ pyenv install 2.7.3   # 安装python
    $ pyenv uninstall 2.7.3 # 卸载python
  • python切换

    1
    2
    $ pyenv global 2.7.3  # 设置全局的 Python 版本,通过将版本号写入 ~/.pyenv/version 文件的方式。
    $ pyenv local 2.7.3 # 设置 Python 本地版本,通过将版本号写入当前目录下的 .python-version 文件的方式。通过这种方式设置的 Python 版本优先级较 global 高。

python优先级

shell > local > global

pyenv 会从当前目录开始向上逐级查找 .python-version 文件,直到根目录为止。若找不到,就用 global 版本。

1
2
3
4
$ pyenv shell 2.7.3 # 设置面向 shell 的 Python 版本,通过设置当前 shell 的 PYENV_VERSION 环境变量的方式。这个版本的优先级比 local 和 global 都要高。–unset 参数可以用于取消当前 shell 设定的版本。
$ pyenv shell --unset

$ pyenv rehash # 创建垫片路径(为所有已安装的可执行文件创建 shims,如:~/.pyenv/versions/*/bin/*,因此,每当你增删了 Python 版本或带有可执行文件的包(如 pip)以后,都应该执行一次本命令)

分享到