注册 登录
  • 进入"运维那点事"后,希望您第一件事就是阅读“关于”栏目,仔细阅读“关于Ctrl+c问题”,不希望误会!

Python多版本及环境管理工具:pyenv和virtualenv

Python闲聊 彭东稳 8911次浏览 已收录 1个评论

一、virtualenv

Python的背后有着庞大的开源社区支持,但是有一个缺点就是每个包的质量都参差不齐,如果我们在工作服务器上去测试安装每个包,就会造成整个的服务器形成庞大复杂的第三方包依赖。virtualenv是一个Python环境配置和切换的工具,可以用它配置多个Python运行环境,和系统中的Python环境隔离,即所谓的沙盒。

沙盒的好处包括:

1. 解决库之间的版本依赖,比如同一系统上不同应用依赖同一个库的不同版本。

2. 解决权限限制,比如你没有root权限。

3. 尝试新的工具,而不用担心污染系统环境。

安装应用virtualenv

1)安装virtualenv

2)创建一个虚拟环境

3)激活虚拟环境同时进入虚拟环境

4)然后可以在虚拟环境中安装包

5)退出虚拟环境

使用virtualenv可以创建多个项目,然后在每个项目运行不同的应用环境,它们相互之间并无干扰。

二、pyenv

pyenv对比virtualenv工具来说,解决的问题不同。virtualenv是一个沙盒,避免环境污染的,而Pyenv是一个Python版本管理器,用来在同一个系统上切换不同的Python解释器的,并且pyenv是使用shell写的,所以容易阅读。经常遇到这样的情况:

  • 系统自带的 Python 是 2.6,自己需要 Python 2.7 中的某些特性;
  • 系统自带的 Python 是 2.x,自己需要 Python 3.x;

此时需要在系统中安装多个Python,但又不能影响系统自带的Python,即需要实现Python的多版本共存。pyenv就是这样一个Python版本管理器。

1. 安装Pyenv

在终端执行如下命令以安装pyenv及其插件(安装pyenv全家桶):

内容除了包含pyenv以外,还包含如下插件(在$HOME/.pyenv/plugins目录下存放):

  • pyenv-doctor
  • pyenv-installer
  • pyenv-update
  • pyenv-virtualenv
  • pyenv-which-ext

默认会安装在当前用户家目录下。安装完成后,根据提示将如下语句加入到 ~/.bash_profile 中:

然后重启终端即可。

2. 查看Python可安装版本

查看可安装的版本(pyenv仅支持此范围内版本安装,如果想扩展可以自行修改pyenv代码)

该命令会列出可以用pyenv安装的Python版本。列表很长,仅列举其中几个:

其中2.7.14和3.6.5这种只有版本号的是Python官方版本,其他的形如anaconda3-5.1.0这种既有名称又有版本后的属于 “衍生版” 或发行版。还有如:ironpython、jython、pypy、pyston等。

3. 安装Python的依赖包

在编译Python过程中会依赖一些其他库文件,因而需要首先安装这些库文件,已知的一些需要预先安装的库如下。

在CentOS/RHEL/Fedora 下:

在Ubuntu下:

4. 安装指定版本

用户可以使用pyenv install安装指定版本的python。如果是做科学计算的话,推荐你安装anaconda3的最新版本,这是一个专门为科学计算准备的发行版。

执行该命令后,会从给定的网址中下载安装文件Python-3.6.4.tar.xz。但由于文件很大,通常下载需要很久。建议的做法是,先执行以上命令然后马上中断安装,这样就知道pyenv要下载的文件的链接。然后用户自己用其他更快的方式(比如wget、迅雷等等)从该链接中下载安装文件,并将安装文件移动到 ~/.pyenv/cache 目录下(该目录默认不存在,用户要自行新建)。 然后重新执行pyenv install 3.5.2 -v命令。该命令会检查 cache 目录下已有文件的完整性,若确认无误,则会直接使用该安装文件进行安装。

安装过程中,若出现编译错误,通常是由于依赖包未满足,需要在安装依赖包后重新执行该命令。

5. 更新数据库

在安装Python或者其他带有可执行文件的模块之后,需要对数据库进行更新:

查看当前已安装的python版本

其中的星号表示当前正在使用的是系统自带的python。

6. 设置Python执行环境

pyenv可以从三个维度来管理Python环境,简称为:当前系统、当前目录、当前shell。这三个维度的优先级从左到右依次升高,即当前系统的优先级最低、当前shell的优先级最高。

如果想修改系统全局的Python环境,可以采用pyenv global PYTHON_VERSION命令。该命令执行后会在$(pyenv root)目录(默认为~/.pyenv)中创建一个名为version的文件(如果该文件已存在,则修改该文件的内容),里面记录着系统全局的Python版本号。但是最好不要这么使用,可能会影响系统或其他运行环境。

所以,一般都是通过pyenv local PYTHON_VERSION命令来修改当前目录的Python环境。命令执行后,会在当前目录中生成一个.python-version文件(如果该文件已存在,则修改该文件的内容),里面记录着当前目录使用的Python版本号。如下:

其中,输出结果前面的”*”表示当前正在使用的版本。查看环境变量,会发现当前目录中的.python-version配置优先于系统全局的~/.pyenv/version配置。

另外一种情况,通过执行pyenv shell PYTHON_VERSION命令,可以修改当前shell的Python环境。执行该命令后,会在当前shell session(Terminal窗口)中创建一个名为PYENV_VERSION的环境变量,然后在当前shell的任意目录中都会采用该环境变量设定的Python版本。此时,当前系统和当前目录中设定的Python版本均会被忽略。

7. 确认Python版本

由于我们使用的是当前目录运行模式,所以在当前目录及子目录进入Python交互模式就可以看到新版本生效了。

如果在父目录运行则会进入系统自带Python环境。

8.  使用pyenv-virtualenv进行环境隔离

经过以上操作,我们在本地计算机中就可以安装多个版本的Python运行环境,并可以按照实际需求进行灵活地切换。然而,很多时候在同一个Python版本下,我们仍然希望能根据项目进行环境分离,就跟之前我们使用virtualenv一样。

在pyenv中,也包含这么一个插件,pyenv-virtualenv,可以实现同样的功能。使用方式如下:

其中,PYTHON_VERSION是具体的Python版本号,例如,3.6.4,PROJECT_NAME是我们自定义的项目名称。比较好的实践方式是,在PROJECT_NAME也带上Python的版本号,以便于识别。

现假设我们有mysite这么一个项目,想针对Python 2.7.13和Python 3.6.4分别创建一个虚拟环境,那就可以依次执行如下命令(前提是相关Python版本包在pyenv中已经安装完毕)。

创建完成后,通过执行pyenv virtualenvs命令,就可以看到本地所有的项目环境。

创建完工作环境以后,可以通过activate和deactivate子命令进入或退出一个工作环境。进入工作环境以后,左边的提示符会显示你当前所在的工作环境,以免因为环境太多导致误操作。

接下来,就可以在不同的工作环境使用pip安装不同的包版本了。

如果想要删除虚拟环境,则使用:

使用pyenv和python-virtualenv插件,我们就能够自由地在不同的版本之间进行切换,相比管理Python版本,不但节省了时间,也避免了工作过程中的相互干扰。以上便是日常开发工作中常用的pyenv命令,基本可以满足绝大多数依赖库环境管理方面的需求。

9. 其他常用功能

  1. pyenv commands查看pyenv支持的所有命令。
  2. pyenv uninstall卸载某个版本或移除某个项目。
  3. pyenv update更新pyenv及其插件。

Tips:

  • 输入python即可使用新版本的python;
  • 系统自带的脚本会以/usr/bin/python的方式直接调用老版本的python,因而不会对系统脚本产生影响;
  • 使用pip安装第三方模块时会自动按照到当前的python版本下,不会和系统模块发生冲突。
  • 使用pip安装模块后,可能需要执行pyenv rehash更新数据库;

如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。
喜欢 (2)or分享 (0)
关于作者:

您必须 登录 才能发表评论!

(1)个小伙伴在吐槽