Python包的依赖管理,有解了!
之前一直比较抵触用 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 依赖的,这样我们就不会随便删除了。
项目依赖治理(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
这下干净了

猜你喜欢LIKE
相关推荐HOT
更多>>
python怎么开发web
Python有多种框架可以用于Web开发。以下是一些常用的PythonWeb框架:1.Django:Django是一个功能强大的Web开发框架,提供了完整的MVC(模型-视图...详情>>
2023-06-15 09:06:25
python常见异常类型
Python中常见的异常类型包括但不限于以下几种:1.`SyntaxError`:语法错误,通常是由于代码编写不符合Python的语法规则导致的。2.`IndentationE...详情>>
2023-06-14 15:55:49
python中print()函数该怎么用
在Python中,`print()`函数用于将指定的值输出到标准输出设备(通常是控制台)。它是一个内置函数,可以在Python程序中使用。`print()`函数的基本...详情>>
2023-06-07 15:19:45
Python中的复杂if语句
在Python中,if语句可以包含相当复杂的逻辑和条件。以下是一些用于构建复杂if语句的有用技巧:1.使用括号以改善可读性:额外的括号可以使if语句...详情>>
2023-04-20 15:52:04
正则化是什么意思?正则化技术解析
正则化(Regularization)是一种用于解决过拟合问题的机器学习技术,采用一种惩罚项来平衡模型的复杂度和性能,减少模型的泛化误差。在机器学习中...详情>>
2023-04-11 13:39:34Python培训问答更多>>
新爬虫软件是什么?就业前景如何
新Python指的是什么?就业前景如何
新python培训课程费用大概是多少?
新python爬虫是什么?基本概念和类型解析
新学python有什么用?对职业发展有实际性帮助吗
新学会python能干什么?python学习需要注意什么
新学c语言还是python?哪个学得快
Python面试题库 更多>>
Python中的pass语句是什么?
怎样将字符串转换为小写?
怎么移除一个字符串中的前导空格?
python中的标识符长度能有多长?
Python区分大小写吗?
解释Python中的join()和split()函数
- 北京校区
- 大连校区
- 广州校区
- 成都校区
- 杭州校区
- 长沙校区
- 合肥校区
- 南京校区
- 上海校区
- 深圳校区
- 武汉校区
- 郑州校区
- 西安校区
- 青岛校区
- 重庆校区
- 太原校区
- 沈阳校区
- 南昌校区
- 哈尔滨校区
