Python多版本开发环境管理工具介绍


Posted in Python onJuly 03, 2019

前言

在Python开发中,有些情况下,我们可能面临在一台机器上同时安装多版本Python的需求。比如:

有多个Python项目,每个项目依赖不同的Python版本。

有一个Python项目,它需要同时支持多个Python版本。

那么,如何高效地在单台机器上实现多个版本Python(具体来说,这里Python指的是Python解释器)的安装和维护呢?

除此之外,我们还可能面临在一台机器上安装多个版本的某个Python第三方库的需求。比如:有多个Python项目,每个项目依赖于不同版本的Python第三方库requests。这时候,如何在单台机器上实现多版本Python requests库的安装和维护呢?

本文介绍一款神器。它提供了最简洁的方法,让上述两种需求同时得到满足。

多版本Python管理

实现多版本Python管理的工具叫做pyenv。它的安装命令为:

curl https://pyenv.run | bash

安装完成后,需要进行简单配置。将下面几行配置信息添加到文件~/.bashrc中,然后执行命令exec "$SHELL",让配置生效。

export PATH="$HOME/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

接着,可以通过查看pyenv版本来检查安装和配置是否成功:

root@hzettv53:~# pyenv -v
pyenv 1.2.12

由于pyenv是基于源代码进行Python的编译和安装的。因此,我们需要先安装编译相关的一些依赖包。由于这些依赖是操作系统相关的。因此,不同的操作系统,安装命令不同。

以常见的Ubuntu/Debian系统为例,安装命令为:

sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libffi-dev liblzma-dev python-openssl

现在就可以使用pyenv安装Python了。安装新版本之前,我们先查看系统当前安装的Python版本:

root@hzettv53:~# pyenv versions
* system (set by /root/.pyenv/version)
root@hzettv53:~# python -V
Python 2.7.12

可见,当前使用的是操作系统自带的Python,其版本为2.7.12。这时,如果我们需要安装一个新的版本,例如Python 3.7.2, 只需执行命令:

pyenv install -v 3.7.2

注意,由于pyenv是基于Python源代码进行编译安装,因此这一步骤会有点慢,需要耐心等待。安装完成后,查看系统中的Python版本:

root@hzettv53:~# pyenv versions
* system (set by /root/.pyenv/version)
3.7.2
root@hzettv53:~# python -V
Python 2.7.12

可以看到,系统中已经有两个版本的Python了。但是当前使用的仍然是系统版本。如果想要使用新安装的版本,只需:

root@hzettv53:~# pyenv global 3.7.2
root@hzettv53:~# pyenv versions
system
* 3.7.2 (set by /root/.pyenv/version)
root@hzettv53:~# python -V
Python 3.7.2

这里命令pyenv global 3.7.2改变了全局的Python版本。如果只想在当前文件夹中使用Python 3.7.2,那么可以执行:pyenv local 3.7.2;如果只想在当前Shell环境中使用Python 3.7.2,那么可以执行:pyenv shell 3.7.2。

如果同时设置了global, local和shell三种Python版本,那么哪一种会真正生效呢?这里有一个优先级排序,即shell > local > global。举例来说,如果先后执行了pyenv local 3.7.2和pyenv global 3.7.3,那么由于local的优先级高于global,所以当前生效的Python版本是3.7.2。

这样,我们便很方便地实现了单一机器上安装多个版本的Python,并且可以根据实际需要,灵活地切换Python版本。

多虚拟环境管理

不同项目之间,不仅依赖的Python版本可能不同,而且依赖的Python第三方库的版本也可能不同。我们将项目所依赖的Python及其第三方库统一称为虚拟环境。如果同时存在多个Python项目,各自依赖不同的虚拟环境,如何有效管理呢?

这时,我们仍然可以使用pyenv来达成我们的目标。使用下述命令可以创建一个指定Python版本的虚拟环境。

pyenv virtualenv <python_version> <environment_name>

虚拟环境的名称建议体现Python项目名称。例如,我们有一个叫做myproject的项目,并且基于Python 3.7.2进行开发,那么可以执行命令:

pyenv virtualenv 3.7.2 myprojectenv

这样,我们便创建了一个名为myprojectenv的虚拟环境。那么如何使用它呢?我们在需要使用这个虚拟环境的地方(例如,cd到项目myproject的文件夹路径),执行以下命令即可:

pyenv local myprojectenv

这时,我们可以看到,当前使用的Python和pip都指向的是虚拟环境myprojectenv:

root@hzettv53:~/workspace/test# pyenv which python
/root/.pyenv/versions/myprojectenv/bin/python
root@hzettv53:~/workspace/test# pyenv which pip
/root/.pyenv/versions/myprojectenv/bin/pip

这意味着,我们此时用pip命令安装的所有Python第三方包,都是安装到了虚拟环境myprojectenv的路径下,而不是系统路径。这样,我们便实现了Python项目和其所依赖的Python开发环境(即虚拟环境)的绑定。不同的Python项目,完全可以各自使用不同的Python虚拟环境,互不影响。

那么,如果一个Python项目需要使用两种Python虚拟环境呢?我们只需要创建两个虚拟环境(例如myprojectenv和myprojectenv2),并且在使用时进行切换即可:

root@hzettv53:~/workspace/myproject# pyenv local myprojectenv
root@hzettv53:~/workspace/myproject:~# python -V
Python 3.7.2
root@hzettv53:~/workspace/myproject# pyenv local myprojectenv2
root@hzettv53:~/workspace/myproject:~# python -V
Python 2.7.12

总结

开发环境的高效管理是软件工程中的一个难题,尤其是需要同时维护多个环境的时候。pyenv提供了在单台机器上实现多版本Python和多类型Python虚拟环境的有效管理。pyenv的使用十分简单,易于上手。

github地址

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
浅析Python 中整型对象存储的位置
May 16 Python
Python矩阵常见运算操作实例总结
Sep 29 Python
python matplotlib 在指定的两个点之间连线方法
May 25 Python
Python中的函数式编程:不可变的数据结构
Oct 08 Python
python 不同方式读取文件速度不同的实例
Nov 09 Python
Python3调用百度AI识别图片中的文字功能示例【测试可用】
Mar 13 Python
Python3 实现文件批量重命名示例代码
Jun 03 Python
pytorch 实现模型不同层设置不同的学习率方式
Jan 06 Python
opencv python Canny边缘提取实现过程解析
Feb 03 Python
Python Flask上下文管理机制实例解析
Mar 16 Python
基于python连接oracle导并出数据文件
Apr 28 Python
python3实现将json对象存入Redis以及数据的导入导出
Jul 16 Python
介绍一款python类型检查工具pyright(推荐)
Jul 03 #Python
Python flask框架post接口调用示例
Jul 03 #Python
Python3安装psycopy2以及遇到问题解决方法
Jul 03 #Python
python调试神器PySnooper的使用
Jul 03 #Python
详解DeBug Python神级工具PySnooper
Jul 03 #Python
使用python来调用CAN通讯的DLL实现方法
Jul 03 #Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
Jul 03 #Python
You might like
php 的加密函数 md5,crypt,base64_encode 等使用介绍
2012/04/09 PHP
深入apache host的配置详解
2013/06/09 PHP
PHP根据传来的16进制颜色代码自动改变背景颜色
2014/06/13 PHP
php中FTP函数ftp_connect、ftp_login与ftp_chmod用法
2014/11/18 PHP
PHP实现的简易版图片相似度比较
2015/01/07 PHP
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
如何用JavaScript动态呼叫函数(两种方式)
2013/05/03 Javascript
Jquery attr(&quot;checked&quot;) 返回checked或undefined 获取选中失效
2013/10/10 Javascript
推荐 21 款优秀的高性能 Node.js 开发框架
2014/08/18 Javascript
百度地图api如何使用
2015/08/03 Javascript
javascript实现粘贴qq截图功能(clipboardData)
2016/05/29 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
完美解决IE9浏览器出现的对象未定义问题
2016/09/29 Javascript
jquery二级目录选中当前页的css样式
2016/12/08 Javascript
详解vue-cli 快速搭建单页应用之遇到的问题及解决办法
2018/03/01 Javascript
原生实现一个react-redux的代码示例
2018/06/08 Javascript
react中实现搜索结果中关键词高亮显示
2018/07/31 Javascript
es6数据变更同步到视图层的方法
2019/03/04 Javascript
Vue实现Header渐隐渐现效果的实例代码
2020/11/05 Javascript
django之常用命令详解
2016/06/30 Python
动态规划之矩阵连乘问题Python实现方法
2017/11/27 Python
python thrift搭建服务端和客户端测试程序
2018/01/17 Python
Python元组及文件核心对象类型详解
2018/02/11 Python
Python装饰器使用你可能不知道的几种姿势
2019/10/25 Python
keras实现theano和tensorflow训练的模型相互转换
2020/06/19 Python
Pycharm github配置实现过程图解
2020/10/13 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
浅谈css3新单位vw、vh、vmin、vmax的使用详解
2017/12/01 HTML / CSS
荷兰优雅女装网上商店:Heine
2016/11/14 全球购物
电子商务网站的创业计划书
2014/01/05 职场文书
护士自我评价
2014/02/01 职场文书
文明餐桌行动实施方案
2014/02/19 职场文书
数字化校园建设方案
2014/05/03 职场文书
建筑安全责任书范本
2014/07/24 职场文书
出国留学导师推荐信
2015/03/26 职场文书
同意离婚答辩状
2015/05/22 职场文书