用pyenv 和 virtualenv 搭建单机多版本python 虚拟开发环境
作为主流开发语言, 用python 开发的程序越来越多。 方便的是大多linux系统里面都默认集成了python, 开发可以随时随地开始。 但有时候这也成为了一个短板, 比如说有时候我们需要开发和调试一些需要安装在默认python路径里的程序, 反复地修改和安装会使系统目录越来越乱,这对于一些有洁癖的程序员来说是不可接受的。 还有时候我们需要在不同的python版本上开发, 而系统一般只会自带一到两种python版本, 切换起来更是麻烦。
本文将介绍如何利用pyenv 和virtualenv 在单机上搭建多版本python 虚拟开发环境。
首先我们搞清楚pyenv 和virtualenv分别是干什么的。
pyenv可以帮助你在一台开发机上建立多个版本的python环境, 并提供方便的切换方法。
virtualenv则提供了一种功能, 就是将一个目录建立为一个虚拟的python环境, 这样的话, 用户可以建立多个虚拟环境, 每个环境里面的python版本可以是不同的, 也可以是相同的, 而且环境之间相互独立。
如果解释得还不是很清楚的话,我们举例说明。
首先我们可以用pyenv 安装多个python 版本, 比如安装了2.5, 2.6, 3.3 三个版本。 用户可以随意切换当前默认的python版本。 但这时候, 每个版本的环境仍是唯一的, 如果我们想在环境中安装一些库的话, 还是会导致这个版本的环境被修改。 这个时候, 如果我们用virtual env去建立虚拟环境, 就可以完全保证系统路径的干净。无论你在虚拟环境中安装了什么程序, 都不会影响已安装版本的系统环境。
说了这么多, 还是动手实践一下来得实在。本文的例子是在一台干净的Ubuntu机器上进行的
1. 首先我们安装pyenv
因为我的Ubuntu是干净的, 所以还需要先安装curl 和 git
sudo apt-get install curl git-core
接下来安装pyenv
curl -L https://raw.github.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash
这个命令会把pyenv安装到当前用户的 ~/.pyenv目录下.
同时, 我们还需要把下面代码存到~/.bashrc文件中:
export PYENV_ROOT="${HOME}/.pyenv" if [ -d "${PYENV_ROOT}" ]; then export PATH="${PYENV_ROOT}/bin:${PATH}" eval "$(pyenv init -)" fi
这段代码的作用主要是指明pyenv的位置, 以便以后可以直接在命令行里面运行pyenv命令。 保存在~/.bashrc 文件中是为了每次用户登陆后自动生效。
所以如果你是第一次运行命令并且没有注销的话, 这一段是不会生效的, 我们还需要运行下面的命令令其生效
source ~/.bashrc
然后就可以直接在命令行里面敲pyenv了。
2. 安装一些必须的包
sudo apt-get build-dep python2.7
后面安装其他版本python的时候会需要这些包
3. 安装某个版本的python
首先我们可以查看一下有哪些版本的python 可以安装
pyenv install --list
结果如下:
2.4 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.5 ...
接下来, 作为例子我们安装两个版本 (2.7.1 和 3.3.5)
pyenv install 2.7.1
pyenv install 3.3.5
安装完毕后, 我们可以查看安装的情况
pyenv versions
输出结果如下:
* system (set by /home/tony/.pyenv/version) 2.7.1 3.3.5
简单来说我们已经在这台机器上安装了三个版本的python
system 代表当前系统的python 版本
2.7.1 和 3.3.5是我们用pyenv安装的
*表示当前的python版本, 可以看到, 我们还在使用的是默认的system 自带的python版本
4. 切换python版本做一下测试
既然已经安装了两个其他版本的python, 我们来做一下测试
pyenv global 2.7.1
这条命令就是将当前python 版本切换到2.7.1
再次运行 pyenv versions, 结果如下:
system * 2.7.1 (set by /home/tony/.pyenv/version) 3.3.5
可以看到当前的python 版本已经切换到2.7.1了, 如果还不放心, 直接运行 ‘python’ 命令进行验证:
tony@ubuntu:~$ python Python 2.7.1 (r271:86832, May 9 2014, 01:07:17) [GCC 4.8.2] on linux3 Type "help", "copyright", "credits" or "license" for more information. >>>
这里可以清楚看到, 当前版本确实是2.7.1
同理, 我们可以继续用python global在各个版本之间进行切换, 如果要切换回系统版本, 请用:
pyenv global system
如果要卸载某个版本的python, 可以这样:
pyenv uninstall x.x.x
5. 利用virtualenv 创建虚拟python环境
现在我们已经安装了多个python版本,但是这还不够, 某些有洁癖的程序员是一定要系统环境足够干净的,这时候我们可以使用virtualenv来创建虚拟python环境
virtualenv本是一个独立的工具,官网在这里:https://pypi.python.org/pypi/virtualenv
幸运的是,如果你是安装我们前面的方式安装pyenv的,那它已经帮我们以plugin的形式安装好了virtualenv, 我们只要使用就好了
首先我们创建一个2.7.1的虚拟环境
pyenv virtualenv 2.7.1 env271
这条命令在本机上创建了一个名为env271的python虚拟环境,这个环境的真实目录位于:~/.pyenv/versions/
注意,命令中的 ‘2.7.1’ 必须是一个安装前面步骤已经安装好的python版本, 否则会出错。
然后我们可以继续通过 ‘pyenv versions’ 命令来查看当前的虚拟环境, 结果如下:
* system (set by /home/tony/.pyenv/version) 2.7.1 3.3.5
env271
这里我们可以看到, 除了已经安装的python版本, 我们多出了一个env271的python虚拟环境
6. 切换和使用新的python虚拟环境
切换到新的虚拟环境的命令为
pyenv activate env271
接下来我们的python环境就已经切换到2.7.1的虚拟环境了, 运行 ‘python’ 命令认证
(env271)tony@ubuntu:~$ python Python 2.7.1 (r271:86832, May 9 2014, 01:07:17) [GCC 4.8.2] on linux3 Type "help", "copyright", "credits" or "license" for more information. >>>
可以看到, python版本已经是2.7.1, 而且是在虚拟环境之中 (env271)
下面基本上你就可以在这个虚拟环境里面为所欲为了 :) 再也不用担心系统路径被搞乱的问题了。
如果要切换回系统环境, 运行这个命令即可
pyenv deactivate
那如果要删除这个虚拟环境呢? 答案简单而且粗暴,只要直接删除它所在的目录就好:
rm -rf ~/.pyenv/versions/env271/