大家好!有解了我是依赖虎哥。 之前一直比较抵触用 Python ,管理很大一部分原因是有解了觉得 Python 项目的环境管理比较混乱。Node.js 有 Npm 包管理工具,依赖通过 package.json 配置项目依赖,管理最多再通过 nvm 来进行环境切换;Java 有 Maven Gradle 来进行包管理和项目依赖配置,有解了并体现在 pom.xml 和 build.gradle 等中。依赖 而 Python 相比编程语言有时更体现了脚本语言的管理特性,系统化和标准化程度都不太高。有解了很多 Python 项目上来就是依赖怼代码,没有声明依赖、管理配置环境的有解了文件。 这样的依赖好处是简单项目堆砌起来非常快,但是管理一旦代码量上了规模,依赖管理、环境配置、项目启动等就到处都是坑。 可是稍微了解了一下后发现其实 Python 不止能当脚本语言来用。基于一定的工具链,Python 也能写出漂亮标准的项目代码、网站模板将环境和依赖理的明明白白。 基于PIP 最基础的依赖管理应当能解决如下问题: 能快速配置好项目依赖,搭建好开发环境。 明确知道当前项目依赖了哪些第三方的包,以及他们的依赖树。 能快速添加和移除给定的依赖,进行依赖调解。 这些功能使用 Pip 工具链其实是能很方便做到的。 快速配置环境(pip) 想简单预览当前环境下的依赖包可以直接用 pip list 命令: $ pip list Package Version ---------- ------------------- certifi 2020.6.20 pip 19.3.1 setuptools 44.0.0.post20200106 对于一个空的 Python 环境,基础一般只会有这四个包。我们这样就知道了当前环境中有哪些包,以及他们的版本。 为了方便说明,我们先多引一些依赖 pip install flask 。 $ pip list Package Version ------------ ------------------- certifi 2020.6.20 click 7.1.2 Flask 1.1.2 itsdangerous 1.1.0 Jinja2 2.11.3 MarkupSafe 1.1.1 pip 19.3.1 setuptools 44.0.0.post20200106 Werkzeug 1.0.1 安装了 Flask 之后,我们发现除了 Flask 他还多引入了好多个间接依赖。 如果想要将这个信息记录下来,我们可以用 pip freeze 命令,记在 requirements.txt 中(一个约定俗成的名字)。 $ pip freeze > requirements.txt $ cat requirements.txt certifi==2020.6.20 click==7.1.2 Flask==1.1.2 itsdangerous==1.1.0 Jinja2==2.11.3 MarkupSafe==1.1.1 好了,记下这个文件,以后我们如果需要在一个新的云南idc服务商 Python 环境中引入当前的依赖,只需要使用 pip install -r requirements.txt 即可。 明确项目依赖(pipdeptree) pip list 或 pip freeze 打印出来的依赖有一个问题,就是并没有明确依赖关系。这样的坏处是,当我们想清理依赖的时候,就不知道到底哪些依赖是能被直接删除的、哪些依赖又是被间接依赖而不能轻易删除的。 例如我们可能在项目中用了 Flask ,但是我们可能不知道 Flask 也引用了 Jinja2 。这是我们如果擅自删除了 Jinja2 ,项目就可能跑不起来。。。 这时就可以使用 pipdeptree 工具来管理依赖树: $ pip install pipdeptree ... $ pipdeptree certifi==2020.6.20 Flask==1.1.2 - click [required: >=5.1, installed: 7.1.2] - itsdangerous [required: >=0.24, installed: 1.1.0] - Jinja2 [required: >=2.10.1, installed: 2.11.3] - MarkupSafe [required: >=0.23, installed: 1.1.1] - Werkzeug [required: >=0.15, installed: 1.0.1] pipdeptree==2.0.0 - pip [required: >=6.0.0, installed: 19.3.1] setuptools==44.0.0.post20200106 现在我们就知道了,原来 Jinja2 是被 Flask 依赖的,这样我们就不会随便删除了。。。香港云服务器 项目依赖治理(pip-autoremove) 那么问题来了,如果我忽然不想依赖 Flask 了,我们需要怎么做呢? 无脑的做法是 pip uninstall flask -y 。不那么显然的是,这其实不够优雅: $ pip uninstall flask -y ... $ pipdeptree certifi==2020.6.20 click==7.1.2 itsdangerous==1.1.0 Jinja2==2.11.3 - MarkupSafe [required: >=0.23, installed: 1.1.1] pipdeptree==2.0.0 - pip [required: >=6.0.0, installed: 19.3.1] setuptools==44.0.0.post20200106 Werkzeug==1.0.1 发现没,Flask 虽然被卸载了,但是他的依赖包并没有卸载干净。你可能需要重新一个一个判断你是否需要剩下的包,然后再递归删除。。。 幸运的是,我们就可以用 pip-autoremove 工具来做这件事。我们重新安装Flask,再用这个工具删除试试: $ pip install flask $ pip install pip-autoremove $ pip-autoremove flask -y $ pipdeptree certifi==2020.6.20 pip-autoremove==0.9.1 pipdeptree==2.0.0 - pip [required: >=6.0.0, installed: 19.3.1] setuptools==44.0.0.post20200106 这下干净了