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实现爬虫下载美女图片
Jul 14 Python
Python实现信用卡系统(支持购物、转账、存取钱)
Jun 24 Python
Python基于pillow判断图片完整性的方法
Sep 18 Python
python面向对象_详谈类的继承与方法的重载
Jun 07 Python
python数据处理实战(必看篇)
Jun 11 Python
Python 实现数据库(SQL)更新脚本的生成方法
Jul 09 Python
查看python安装路径及pip安装的包列表及路径
Apr 03 Python
windows下安装Python虚拟环境virtualenvwrapper-win
Jun 14 Python
Python叠加两幅栅格图像的实现方法
Jul 05 Python
python 实现兔子生兔子示例
Nov 21 Python
Python可以实现栈的结构吗
May 27 Python
在django中实现choices字段获取对应字段值
Jul 12 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实现文件上传二法
2006/10/09 PHP
mysql建立外键
2006/11/25 PHP
CI框架在CLI下执行占用内存过大问题的解决方法
2014/06/17 PHP
thinkPHP框架实现的无限回复评论功能示例
2018/06/09 PHP
PHP实现的服务器一致性hash分布算法示例
2018/08/09 PHP
让网页跳转到指定位置的jquery代码非书签
2013/09/06 Javascript
JavaScript中的ArrayBuffer详细介绍
2014/12/08 Javascript
CSS javascript 结合实现悬浮固定菜单效果
2015/08/23 Javascript
原生js的数组除重复简单实例
2016/05/24 Javascript
3kb jQuery代码搞定各种树形选择的实现方法
2016/06/10 Javascript
多功能jQuery树插件zTree实现权限列表简单实例
2016/07/12 Javascript
Bootstrap Validator 表单验证
2016/07/25 Javascript
AngularJS表达式讲解及示例代码
2016/08/16 Javascript
jQuery插件版本冲突的处理方法分析
2017/01/16 Javascript
微信小程序 视图容器组件的详解及实例代码
2017/01/19 Javascript
js实现导航吸顶效果
2017/02/24 Javascript
JS中正则表达式全局匹配模式 /g用法详解
2017/04/01 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
webuploader分片上传的实现代码(前后端分离)
2018/09/10 Javascript
jQuery实现ajax的嵌套请求案例分析
2019/02/16 jQuery
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
Python函数中*args和**kwargs来传递变长参数的用法
2016/01/26 Python
《与孩子一起学编程》python自测题
2018/05/27 Python
Python面向对象之类和对象实例详解
2018/12/10 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
2019/04/15 Python
你可能不知道的Python 技巧小结
2020/01/29 Python
pycharm运行程序时看不到任何结果显示的解决
2020/02/21 Python
django使用F方法更新一个对象多个对象字段的实现
2020/03/28 Python
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
你在项目中用到了xml技术的哪些方面?如何实现的?
2014/01/26 面试题
莫言获奖感言(全文)
2015/07/31 职场文书
适合毕业生创业的项目怎么找?
2019/08/08 职场文书
golang中实现给gif、png、jpeg图片添加文字水印
2021/04/26 Golang
常用的Python代码调试工具总结
2021/06/23 Python
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
css3中2D转换之有趣的transform形变效果
2022/02/24 HTML / CSS