Python 包的依赖管理,有解了!
时间:2025-11-03 18:09:46 出处:域名阅读(143)

大家好!有解了我是依赖虎哥。
之前一直比较抵触用 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
wheel 0.36.2对于一个空的 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
wheel 0.36.2安装了 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
Werkzeug==1.0.1好了,记下这个文件,以后我们如果需要在一个新的云服务器提供商 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
wheel==0.36.2现在我们就知道了,原来 Jinja2 是被 Flask 依赖的,这样我们就不会随便删除了。。。b2b供应网
项目依赖治理(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
wheel==0.36.2发现没,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
wheel==0.36.2这下干净了