介绍
出于种种原因,很多人的电脑上会同时安装很多个版本的 Python,比如会有 2.7 + 3.4。一般在 windows 下我们都可以通过使用绝对路径的方式来绕过系统对 PATH 环境变量的查询;在 Linux 下除了这种方式外,还可以在脚本文件开头显示指定需要使用的解释器,就像这样:#!/usr/bin/env python2.7 或 #!usr/bin/env python3.4。一旦特定版本的解释器被打开后,就不用再担心 PATH 的问题了
对于上述问题的解决方案,更多人可能会首先想到 virtualenv。但与用于创建独立包环境的 virtualenv 不同,pyenv 的作用仅限于维护不同版本的 Python。它的使用不依赖于 Python,是一个简单、独立的纯 shell 脚本工具。pyenv 也以 pyenv-virtualenv 插件的形式支持 virtualenv,强烈建议使用。安装后比较方便的是可以在你 cd 到项目目录时自动切换相应的虚拟环境,而不用老是 source.
pyenv 在安装和配置完毕后可以实现:一键(命令)切换全局、本地或当前 shell 使用的 Python 版本。
pyenv 原理
pyenv 的美好之处在于,他并没有使用将不同的 PATH植入不同的shell这种高耦合的工作方式,而是简单地在PATH 的最前面插入了一个垫片路径(shims):~/.pyenv/shims:/usr/local/bin:/usr/bin:/bin。所有对 Python 可执行文件的查找都会首先被这个 shims 路径截获,从而架空了后面的系统路径。
安装pyenv
pyenv 的 github 页面 提供了完整的安装与使用指导,所以本文基本上就是对 Readme 的翻译和解释
手动安装
手动安装详细步骤如下:
$mkdir ~/.pyenv
$git clone git://github.com/yyuu/pyenv.git .pyenv
$ echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bash_profile
$ echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bash_profile
$ echo 'eval "$(pyenv init -)"' >> ~/.bash_profile #向 shell 添加 pyenv init 以启用 shims 和命令补完功能
$ exec $SHELL
$ source ~/.bash_profile
> 这里的 shell 配置文件(~/.bash_profile)依不同Linux 而需作修改—— Zsh:~/.zshenv; Ubuntu:~/.bashrc
自动安装
$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
pyenv 命令总结
详细列表:https://github.com/yyuu/pyenv/blob/master/COMMANDS.md#command-reference
常用命令如下:
- pyenv versions:查看当前 pyenv 可检测到的所有版本,处于激活状态的版本前以 * 标示。
- pyenv version:查看当前处于激活状态的版本,括号中内容表示这个版本是由哪条途径激活的(global、local、shell)
- pyenv install:使用 python-build(一个插件) 安装一个 Python 版本,到 $PYENV_ROOT/versions 路径下。建议添加 -v 参数用于显示细节。python-build 会首先尝试从一个镜像站点下载包,此时可以去 /tmp/python-build.xxx 里面关心一下下载速度
- pyenv uninstall:卸载一个版本
- pyenv rehash:为所有已安装的可执行文件 (如:~/.pyenv/versions//bin/) 创建 shims,因此,每当你增删了 Python 版本或带有可执行文件的包(如 pip)以后,都应该执行一次本命令
- pyenv global:设置全局的 Python 版本,通过将版本号写入 ~/.pyenv/version 文件的方式。
- pyenv local:设置面向程序的本地版本,通过将版本号写入当前目录下的 .python-version 文件的方式。通过这种方式设置的 Python 版本优先级较 global 高。pyenv 会从当前目录开始向上逐级查找 .python-version 文件,直到根目录为止。若找不到,就用 global 版本。
- pyenv shell:设置面向 shell 的 Python 版本,通过设置当前 shell 的 PYENV_VERSION 环境变量的方式。这个版本的优先级比 local 和 global 都要高。–unset 参数可以用于取消当前 shell 设定的版本。
安装pyenv-virtualenv
介绍
pyenv virtualenv是pyenv的插件,为UNIX系统上的Python virtualenvs提供pyenv virtualenv命令。
安装步骤
$git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
$echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile
$source ~/.bash_profile
实践
多个Python版本快速切换
- 首先我们可以查看一下有哪些版本的python 可以安装: pyenv install –list
- 安装: pyenv install -v 3.5.3 (这个过程会比较漫长)
- pyenv versions (查看所有版本)
$ pyenv versions
* system (set by /root/.pyenv/version)
3.5.3
- pyenv version (查看当前版本)
系统中不同python版本切换:
#全局切换到3.5.3
pyenv global 3.5.3
#全局还原
pyenv global system
#为单独文件夹切换到3.5.3
pyenv local 3.5.3
#为单独文件夹还原
pyenv local system
利用virtualenv 创建虚拟python环境
- 创建一个3.5.3的环境:$ pyenv virtualenv 3.5.3 env353 (这条命令在本机上创建了一个名为env353的python虚拟环境,这个环境的真实目录位于:~/.pyenv/versions/)
- 切换和使用新的python虚拟环境:$ pyenv activate env353
- 环境验证
(env353) root@native:~# pyenv activate env353
pyenv-virtualenv: prompt changing will be removed from future release. configure `export PYENV_VIRTUALENV_DISABLE_PROMPT=1' to simulate the behavior.
(env353) root@native:~# python --version
Python 3.5.3
(env353) root@native:~# pip list
DEPRECATION: The default format will switch to columns in the future. You can use --format=(legacy|columns) (or define a format=(legacy|columns) in your pip.conf under the [list] section) to disable this warning.
pip (9.0.1)
setuptools (28.8.0)
可以看到, python版本已经是3.5.3, 而且是在虚拟环境之中 (env353),这时可以对这个环境进行任意包的安装,且不会对其他环境造成影响
- 离开环境:pyenv deactivate