Python 沙盒环境配置
全局Python环境中,出现了依赖包版本冲突
Python以其灵活强大,没无所不能而闻名。在Python中,我们可以通过pip
作为包管理工具,但是如果直接使用pip install <pkg_name>==<pkg_version>
的时候,会直接把包安装到全局环境。如果两个不同项目依赖了同一个包,他们的版本冲突了,这将非常难搞。
将所有的包都安装到全局环境,这显然是一个非常糟糕的决策。
每个服务搞自己的沙盒环境
所幸,有很多解决方案。
其中比较好的解决方案是 virtualenv
。可以为每一个项目都创建一个属于自己的虚拟沙盒环境。各个项目使用自己的虚拟环境,安装依赖包也在自己一亩三分地使用pip
进行,防止对全局的环境造成污染。
通过执行上述的命令,将会在/tmp/venv/project
目录下创建新的沙盒环境,名为 venv
。接下来,通过以下命令激活沙盒环境:
如何验证?
如果输出为/tmp/venv_project/venv/bin/pip
,则证明现在使用的pip
是新创建沙盒环境中的,可以在里边随意安装依赖,不用担心会谢领导全局
同时,pip
也支持导出当前环境中的依赖关系,一般实践是通过以下命令:
导出的requirements.txt
推荐随代码提交到版本管理系统(默认git
),方便合作方创建相同的沙盒环境&&更新依赖版本。
通过上述命令即可根据requirements.txt
中每一行进行安装。
继续优化
看似很多问题已经解决了,但是还是有些细节可以继续优化。
不同项目依赖同一个沙盒环境?
如何快速了解自己使用的是哪套环境?沙盒1,沙盒2,还是全局?
cd
到项目目录下,能否自动激活当前项目的沙盒环境?离开目录的时候,自动退出?
不同项目依赖同一个沙盒环境
这个做法看似与沙盒环境本身的目标在一定程度上是相悖的。但是完全独立的沙盒环境在实践中会出现自己的问题。
如果服务上云的话,每次构建镜像的时候都重新根据
requirements.txt
拉取依赖,非常耗时,且无法保证稳定,无法保证两次间隔较大的安装,拉取下来的环境完全一致(requirements.txt 中支持包版本为 latest)对环境本身的维护将是一个非常耗时且风险大的事情,如何保证环境中引入的包是无风险的。通查需要团队抽出专门人力去维护项目的沙盒环境。
所以在我们的实践中,我们选择的方式是将虚拟环境本身作为一个项目。如果变更虚拟环境中依赖的包版本、或添加新的依赖包进去的时候,需要交付QA进行测试。同时提交到远端的代码需要使用与线上相同的环境构建,将变更后的所有代码提交到远端。
(PS: 这样的做法与虚拟沙箱环境的主张在一定程度上相悖,是在实践中我们对现实情况做的妥协。并不一定对,但是确实解决了我们现存的紧要问题)
如何了解自己使用的是哪套沙盒环境
一般项目部署到生产环境中之后,不会有这样的问题。在开发的时候,当涉及到对依赖包进行变更的时候,如果所处的环境不对,没有source /tmp/venv_project/venv/bin/activate
的话,就会把包安装到全局环境(或者其他沙盒)下,不知不觉的污染了全局环境(或者其他的沙盒)。
方法一
安装依赖之前,先查看一下 pip
命令实际所处的是不是在预期虚拟的沙盒环境之下。如果不是的话,不要变更依赖
方法二
如何 shell 本身支持展示的话,是非常棒的。
简单的就是直接使用oh-my-zsh
配置更强大的zsh
,就能够展示虚拟沙盒环境的名称了。当然,也可以去仿照其自己实现。
综述
同时,不同项目的沙盒环境名称最好不要相同,或者能够进行沙盒环境的自动切换
沙盒环境自动切换
zsh
支持使用 plugin
。其中内置的的一个插件叫 autoenv。启用插件后,
当切换到包含
.in
文件的目录时候,会触发.in
文件中命令的执行当离开包含
.out
文件的目录的时候,会触发.out
文件中命令的执行
当然,这个插件能解决的问题远不止于此。当然,由于需要在本机进行很多配置,上述的两个文件不推荐纳入版本控制。
版权声明: 本文为 InfoQ 作者【黄耗子皮】的原创文章。
原文链接:【http://xie.infoq.cn/article/68c6d4808609aad45462b8ec2】。文章转载请联系作者。
评论