Python 沙盒环境配置

发布于: 2020 年 05 月 27 日

全局Python环境中,出现了依赖包版本冲突

Python以其灵活强大,没无所不能而闻名。在Python中,我们可以通过pip作为包管理工具,但是如果直接使用pip install <pkg_name>==<pkg_version>的时候,会直接把包安装到全局环境。如果两个不同项目依赖了同一个包,他们的版本冲突了,这将非常难搞。

将所有的包都安装到全局环境,这显然是一个非常糟糕的决策。

每个服务搞自己的沙盒环境

所幸,有很多解决方案。

其中比较好的解决方案是 virtualenv。可以为每一个项目都创建一个属于自己的虚拟沙盒环境。各个项目使用自己的虚拟环境,安装依赖包也在自己一亩三分地使用pip进行,防止对全局的环境造成污染。

$ mkdir /tmp/venv_project && cd /tmp/venv/venv_project
$ virtualenv -v -p /usr/bin/python3 --no-site-packages --no-wheel venv

通过执行上述的命令,将会在/tmp/venv/project目录下创建新的沙盒环境,名为 venv。接下来,通过以下命令激活沙盒环境:

$ source /tmp/venv_project/venv/bin/activate

如何验证?

$ which pip

如果输出为/tmp/venv_project/venv/bin/pip,则证明现在使用的pip是新创建沙盒环境中的,可以在里边随意安装依赖,不用担心会谢领导全局

同时,pip 也支持导出当前环境中的依赖关系,一般实践是通过以下命令:

(venv) $ pip freeze > requirements.txt

导出的requirements.txt推荐随代码提交到版本管理系统(默认git),方便合作方创建相同的沙盒环境&&更新依赖版本。

pip install -r requirements.txt

通过上述命令即可根据requirements.txt中每一行进行安装。

继续优化

看似很多问题已经解决了,但是还是有些细节可以继续优化。

  1. 不同项目依赖同一个沙盒环境?

  2. 如何快速了解自己使用的是哪套环境?沙盒1,沙盒2,还是全局?

  3. cd到项目目录下,能否自动激活当前项目的沙盒环境?离开目录的时候,自动退出?

不同项目依赖同一个沙盒环境

这个做法看似与沙盒环境本身的目标在一定程度上是相悖的。但是完全独立的沙盒环境在实践中会出现自己的问题。

  1. 如果服务上云的话,每次构建镜像的时候都重新根据requirements.txt拉取依赖,非常耗时,且无法保证稳定,无法保证两次间隔较大的安装,拉取下来的环境完全一致(requirements.txt 中支持包版本为 latest

  2. 对环境本身的维护将是一个非常耗时且风险大的事情,如何保证环境中引入的包是无风险的。通查需要团队抽出专门人力去维护项目的沙盒环境。

所以在我们的实践中,我们选择的方式是将虚拟环境本身作为一个项目。如果变更虚拟环境中依赖的包版本、或添加新的依赖包进去的时候,需要交付QA进行测试。同时提交到远端的代码需要使用与线上相同的环境构建,将变更后的所有代码提交到远端。

(PS: 这样的做法与虚拟沙箱环境的主张在一定程度上相悖,是在实践中我们对现实情况做的妥协。并不一定对,但是确实解决了我们现存的紧要问题)

如何了解自己使用的是哪套沙盒环境

一般项目部署到生产环境中之后,不会有这样的问题。在开发的时候,当涉及到对依赖包进行变更的时候,如果所处的环境不对,没有source /tmp/venv_project/venv/bin/activate的话,就会把包安装到全局环境(或者其他沙盒)下,不知不觉的污染了全局环境(或者其他的沙盒)。

方法一

安装依赖之前,先查看一下 pip 命令实际所处的是不是在预期虚拟的沙盒环境之下。如果不是的话,不要变更依赖

方法二

如何 shell 本身支持展示的话,是非常棒的。

简单的就是直接使用oh-my-zsh配置更强大的zsh,就能够展示虚拟沙盒环境的名称了。当然,也可以去仿照其自己实现。

综述

同时,不同项目的沙盒环境名称最好不要相同,或者能够进行沙盒环境的自动切换

沙盒环境自动切换

zsh 支持使用 plugin。其中内置的的一个插件叫 autoenv。启用插件后,

  1. 当切换到包含.in文件的目录时候,会触发.in文件中命令的执行

  2. 当离开包含.out文件的目录的时候,会触发.out文件中命令的执行

# .in 激活沙盒环境
source /tmp/venv_project/venv/bin/activate

# .out 退出激活的沙盒环境
deactivate

当然,这个插件能解决的问题远不止于此。当然,由于需要在本机进行很多配置,上述的两个文件不推荐纳入版本控制。

发布于: 2020 年 05 月 27 日 阅读数: 2
用户头像

黄耗子皮

关注

还未添加个人签名 2018.12.22 加入

还未添加个人简介

评论

发布
暂无评论
Python 沙盒环境配置