使用pyenv管理多版本python

2,490 阅读4分钟

在开发Python程序的时候,有时候可能需要在不同版本的 Python 上进行测试。pyenv就是这么一个管理多版本 Python 的工具。pyenv 是利用系统环境变量 PATH 的优先级,劫持 python 的命令到 pyenv 上,根据用户所在的环境或目录,使用不同版本python

Mac下安装

安装

Mac OSX下可直接使用brew安装

# brew update
# brew install pyenv

设置环境变量

如果使用的是 bash,将以下环境变量添加到 ~/.bash_profile,如果使用的是 zsh,则添加到 ~/.zshrc

# echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.zshrc
# echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.zshrc

启动shell时,自动初始化pyenv

# echo 'eval "$(pyenv init -)"' >> ~/.zshrc

重载配置文件

# source ~/.zshrc

查看pyenv版本

# pyenv -v
pyenv 1.2.14

CentOS下安装

安装

由于pyenv是通过下载 python 源码包编译安装,为了保证在编译时不出错,建议安装前安装相关依赖环境(当前环境 CentOS Linux release 7.7.1908 (Core) Minimal仅安装libffi-devel个例不代表全部

# yum install -y gcc tk-devel @development zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel findutils

Github地址:

一般在使用python的时候会涉及到多个版本、不同版本的python创建的虚拟环境,手动安装pyenv后同样需要手动安装pyenv-virtualenv才能管理多个不同的虚拟环境。为了安装方便,我们选用官方提供的一键式安装脚本来直接安装pyenvpyenv-virtualenv

# curl https://pyenv.run | bash

设置环境变量

然后添加环境变量到你当前使用的shell

  • bash: vim ~/.bashrc
  • zsh: vim ~/.zshrc
export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

重载配置文件

# source ~/.zshrc

查看pyenv版本

# pyenv -v
pyenv 1.2.14

使用

pyenv常用命令

注:使用local、global、shell,设置Python版本时需要跟上参数(版本号),查看则不需要。

使用方式: pyenv <命令> [<参数>]

命令:
  commands    查看所有命令
  local       设置或显示本地的Python版本
  global      设置或显示全局Python版本
  shell       设置或显示shell指定的Python版本
  install     安装指定Python版本
  uninstall   卸载指定Python版本)
  version     显示当前的Python版本及其本地路径
  versions    查看所有已经安装的版本
  which       显示安装路径

pyenv

  • 查看系统当前安装的python列表

    # pyenv versions
    
  • 列出可安装版本

    # pyenv install --list
    
  • 安装指定版本 Python

    # pyenv install <版本号>
    
  • 卸载指定版本 Python

    # pyenv uninstall <版本号>
    
  • 显示当前python安装路径

    # pyenv which python
    
  • 设置全局的 Python 版本,通过将版本号写入 ~/.pyenv/version 文件的方式

    # pyenv global <版本号>
    
  • 设置面向程序的本地版本,通过将版本号写入当前目录下的 .python-version 文件的方式。通过这种方式设置的 Python 版本优先级较 global 高。

    # pyenv local <版本号>
    
  • 设置面向 shellPython 版本,通过设置当前 shellPYENV_VERSION 环境变量的方式。这个版本的优先级比 localglobal 都要高。

    # pyenv shell <版本号>
    
    • --unset 参数可以用于取消当前 shell 设定的版本。

      # pyenv shell --unset
      

pyenv-virtualenv

  • 查看所有虚拟环境

    # pyenv virtualenvs
    
  • 创建指定python版本的虚拟环境

    # pyenv virtualenv <python版本> <虚拟环境名>
    
  • 使用虚拟环境生效

    # pyenv activate <虚拟环境名>
    
  • 退出虚拟环境

    # pyenv deactivate
    
  • 删除虚拟环境,简单粗暴地将整个目录干掉即可

    # pyenv uninstall <虚拟环境名>
    

修改pip源

在使用python时如果网络状态不佳直接从官方pip仓库拉取代码速度较慢,推荐使用阿里云pypi镜像仓库

# mkdir ~/.pip && vim ~/.pip/pip.conf

添加如下内容

[global]
index-url = https://mirrors.aliyun.com/pypi/simple/

[install]
trusted-host=mirrors.aliyun.com

常见问题

在尝试安装新的Python版本之前,请先安装Python构建依赖项pywiki 如果您在安装python版本时遇到问题,请访问有关常见构建问题的Wiki页面

pyinstaller

直接使用pyenv install 3.7.5安装后使用pyinstaller打包会报如下错误

OSError: Python library not found: libpython3.7m.so.1.0, libpython3.7.so.1.0, libpython3.7mu.so.1.0
This would mean your Python installation doesn't come with proper library files.
This usually happens by missing development package, or unsuitable build parameters of Python installation.

* On Debian/Ubuntu, you would need to install Python development packages
  * apt-get install python3-dev
  * apt-get install python-dev
* If you're building Python by yourself, please rebuild your Python with `--enable-shared` (or, `--enable-framework` on Darwin)

需要使用如下方法重新安装python:

  • Mac OSX
    # env PYTHON_CONFIGURE_OPTS="--enable-framework" pyenv install 3.7.5
    
  • CentOS
    # env PYTHON_CONFIGURE_OPTS="--enable-shared" pyenv install 3.7.5
    

pip install报错

使用pip install时报错如下:ModuleNotFoundError: No module named '_ctypes'

需要安装相关依赖包libffi-devel,后再次重新编译安装python

# yum -y install libffi-devel