在开发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才能管理多个不同的虚拟环境。为了安装方便,我们选用官方提供的一键式安装脚本来直接安装pyenv与pyenv-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 <版本号>
- 设置面向 
shell的Python版本,通过设置当前shell的PYENV_VERSION环境变量的方式。这个版本的优先级比local和global都要高。 
    # 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