Python 包的依赖管理方法整理记录

news/2025/2/3 5:51:48/

        python下载的包或者依赖一直没有关注过,直到卸载时才发现有卸载残留,所以特此整理一番。

        Node.js 有 Npm 包管理工具,通过 package.json 配置项目依赖,最多再通过 nvm 来进行环境切换;

        Java 有 Maven Gradle 来进行包管理和项目依赖配置,并体现在 pom.xml 和 build.gradle 等中

稍微了解了一下后发现其实 Python 不止能当脚本语言来用。基于一定的工具链,Python 也能写出漂亮标准的项目代码、将环境和依赖理的明明白白。


基于PIP


最基础的依赖管理应当能解决如下问题:

  1. 能快速配置好项目依赖,搭建好开发环境。

  2. 明确知道当前项目依赖了哪些第三方的包,以及他们的依赖树。

  3. 能快速添加和移除给定的依赖,进行依赖调解。

这些功能使用 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 依赖的,这样我们就不会随便删除了。。。

项目依赖治理(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

这下干净了😊。

其它方式暂不考虑,对于我这个懒人偶尔用用就可以了,不想下载基于Conda的大型包管理,有其他好方法欢迎留言交流。

---The End---

后续有好方法还会继续更新,欢迎大家一起交流互助。

如果对你有帮助请关注哦!


http://www.ppmy.cn/news/52990.html

相关文章

如何利用代码快速生成mapper.xml的<resultMap>

一,问题引入 当我们开发 mapper.xml ---->dao接层 ---->service接口---->serviceImp ---->controller层, 其中在mapper.xml编写查询语句的sql时会遇到sql查询到的结果 涉及到多张表的字段,或者单张表的字段过多时, 这…

【UE】简易的水材质

引擎版本:4.26 效果 步骤 1. 创建一个材质,命名为“M_Water” 2. 打开“M_Water”,将混合模式设为半透明, 光照模式设为表面半透明体积,在这种模式下我们可以使用金属度、粗糙度等接口 3. 创建一个4维常量节点&…

笠翁对韵-喜欢拿走

《笠翁对韵》 清李渔 著 卷上 一 东   天对地,雨对风。大陆对长空。山花对海树,赤日对苍穹。雷隐隐,雾蒙蒙。日下对天中。风高秋月白,雨霁晚霞红。牛女二星河左右,参商两曜斗西东。十月塞边,飒飒寒霜惊…

阿里EGES

EGES:Billion-scale Commodity Embedding for E-commerce Recommendation in Alibaba 阿里的EGES是Graph Embedding的一个经典应用,在内容冷启和物料召回上面有较多的落地潜力。主要思想是根据用户交互的物料作为节点构建物料图,在传统的Dee…

从零入门激光SLAM——总目录与更新情况

第一章 初识 1.1 什么是SLAM 从零入门激光SLAM(一)——什么是SLAM_桦树无泪的博客-CSDN博客 1.2 什么是Ubuntu 从零入门激光SLAM(二)——Ubuntu基础_乌班图系统架构_桦树无泪的博客-CSDN博客 1.3 什么是ROS 从零入门激光S…

pycharm常用快捷键

1、代码编辑快捷键 序号快捷键作用1Ctrl Space 基本的代码完成(类、方法、属性) 2Ctrl Alt Space快速导入任意类3Ctrl Shift Enter代码补全4Shift F1查看外部文档5Ctrl Q快速查找文档6Ctrl P参数信息(在方法中调用的参数&#xff09…

直播预告:重保常见攻击场景及解决方案

重保在即,针对邮件系统的网络攻击、主机威胁、账号失陷等攻击场景,该如何应对? 4月25日(周二)15:00-16:30 Coremail举行重保常见攻击场景及解决方案直播交流会 在这里,您将看到&…

Ajax的简单使用

目录 1、ajax概述 2、模拟ajax 3、Jquery实现ajax (1)通用开发步骤 (2)示例 注册用户名重复性验证 (3)示例 ajax解析json数据 (4)实现细节 4、axios实现ajax 5、ajax发送PUT…