电子发烧友网 > 嵌入式技术 > 编程语言及工具 > 正文

Python如何管理所用的全部依赖库

2020年11月21日 11:16 次阅读

在Python的项目中,如何管理所用的全部依赖库呢?最主流的做法是维护一份“requirements.txt”,记录下依赖库的名字及其版本号。

那么,如何来生成这份文件呢?在上篇文章《由浅入深:Python中如何实现自动导入缺失的库?》中,我提到了一种常规的方法:

pipfreeze>requirements.txt

这种方法用起来方便,但有几点不足:

•它搜索依赖库的范围是全局环境,因此会把项目之外的库加入进来,造成冗余(一般是在虚拟环境中使用,但还是可能包含无关的依赖库)

•它只会记录以“pipinstall”方式安装的库

•它对依赖库之间的依赖关系不做区分

•它无法判断版本差异及循环依赖等情况

…………

可用于项目依赖管理的工具有很多,本文主要围绕与requirements.txt文件相关的、比较相似却又各具特色的4个三方库,简要介绍它们的使用方法,罗列一些显著的功能点。至于哪个是最好的管理方案呢?卖个关子,请往下看……

pipreqs

这是个很受欢迎的用于管理项目中依赖库的工具,可以用“pipinstallpipreqs”命令来安装。它的主要特点有:

•搜索依赖库的范围是基于目录的方式,很有针对性

•搜索的依据是脚本中所import的内容

•可以在未安装依赖库的环境上生成依赖文件

•查找软件包信息时,可以指定查询方式(只在本地查询、在PyPi查询、或者在自定义的PyPi服务)

基本的命令选项如下:

Usage:pipreqs[opTIons]OpTIons:--use-localUseONLYlocalpackageinfoinsteadofqueryingPyPI--pypi-serverUsecustomPyPiserver--proxyUseProxy,parameterwillbepassedtorequestslibrary.Youcanalsojustsettheenvironmentsparameterinyourterminal:$exportHTTP_PROXY="http://10.10.1.10:3128"$exportHTTPS_PROXY="https://10.10.1.10:1080"--debugPrintdebuginformaTIon--ignore...Ignoreextradirectories--encodingUseencodingparameterforfileopen--savepathSavethelistofrequirementsinthegivenfile--printOutputthelistofrequirementsinthestandardoutput--forceOverwriteexisTIngrequirements.txt--diffComparemodulesinrequirements.txttoprojectimports.--cleanCleanuprequirements.txtbyremovingmodulesthatarenotimportedinproject.

其中需注意,很可能遇到编码错误:UnicodeDecodeError:'utf-8'codeccan'tdecodebyte0xaein。需要指定编码格式“--encoding=utf8”。

在已生成依赖文件“requirements.txt”的情况下,它可以强行覆盖、比对差异以及清除不再使用的依赖项。

pigar

pigar同样可以根据项目路径来生成依赖文件,而且会列出依赖库在文件中哪些位置使用到了。这个功能充分利用了requirements.txt文件中的注释,可以提供很丰富的信息。

pigar对于查询真实的导入源很有帮助,例如bs4模块来自beautifulsoup4库,MySQLdb则来自于MySQL_Python库。可以通过“-s”参数,查找真实的依赖库。

$pigar-sbs4MySQLdb

它使用解析AST的方式,而非正则表达式的方式,可以很方便地从exec/eval的参数、文档字符串的文档测试中提取出依赖库。

另外,它对于不同Python版本的差异可以很好地支持。例如,concurrent.futures是Python3.2+的标准库,而在之前早期版本中,需要安装三方库futures,才能使用它。pigar做到了有效地识别区分。(PS:pipreqs也支持这个识别,详见这个合入:https://github.com/bndr/pipreqs/pull/80

pip-tools

pip-tools包含一组管理项目依赖的工具:pip-compile与pip-sync,可以使用命令“pipinstallpip-tools”统一安装。它最大的优势是可以精准地控制项目的依赖库。

两个工具的用途及关系图如下:


pip-compile命令主要用于生成依赖文件和升级依赖库,另外它可以支持pip的“Hash-CheckingMode”,并支持在一个依赖文件中嵌套其它的依赖文件(例如,在requirements.in文件内,可以用“-crequirements.txt”方式,引入一个依赖文件)。

它可以根据setup.py文件来生成requirements.txt,假如一个Flask项目的setup.py文件中写了“install_requires=['Flask']”,那么可以用命令来生成它的所有依赖:

$pip-compile##Thisfileisautogeneratedbypip-compile#Toupdate,run:##pip-compile--output-filerequirements.txtsetup.py#click==6.7#viaflaskflask==0.12.2itsdangerous==0.24#viaflaskjinja2==2.9.6#viaflaskmarkupsafe==1.0#viajinja2werkzeug==0.12.2#viaflask

在不使用setup.py文件的情况下,可以创建“requirements.in”,在里面写入“Flask”,再执行“pip-compilerequirements.in”,可以达到跟前面一样的效果。

pip-sync命令可以根据requirements.txt文件,来对虚拟环境中进行安装、升级或卸载依赖库(注意:除了setuptools、pip和pip-tools之外)。这样可以有针对性且按需精简地管理虚拟环境中的依赖库。

另外,该命令可以将多个“*.txt”依赖文件归并成一个:

$pip-syncdev-requirements.txtrequirements.txt

pipdeptree

它的主要用途是展示Python项目的依赖树,通过有层次的缩进格式,显示它们的依赖关系,不像前面那些工具只会生成扁平的并列关系。

除此之外,它还可以:

•生成普遍适用的requirements.txt文件

•逆向查找某个依赖库是怎么引入进来的

•提示出相互冲突的依赖库

•可以发现循环依赖,进行告警

•生成多种格式的依赖树文件(json、graph、pdf、png等等)

它也有缺点,比如无法穿透虚拟环境。如果要在虚拟环境中工作,必须在该虚拟环境中安装pipdeptree。因为跨虚拟环境会出现重复或冲突等情况,因此需要限定虚拟环境。但是每个虚拟环境都安装一个pipdeptree,还是挺让人难受的。

好啦,4种库介绍完毕,它们的核心功能都是分析依赖库,生成requirements.txt文件,同时,它们又具有一些差异,补齐了传统的pip的某些不足。

本文不对它们作全面的测评,只是选取了一些主要特性进行介绍,好在它们安装方便(pipinstallxxx),使用也简单,感兴趣的同学不妨一试。

编辑:hfy


下载发烧友APP

打造属于您的人脉电子圈

关注电子发烧友微信

有趣有料的资讯及技术干货

关注发烧友课堂

锁定最新课程活动及技术直播

电子发烧友观察

一线报道 · 深度观察 · 最新资讯
收藏 人收藏
分享:

评论

相关推荐

零基础Python入门教程二

随着新技术的不断推进,在未来无论你要进入网页开发、数据分析、机器学习、人工智能还是无人车等领域,Python 都是必不可
发烧友学院发表于 2019-04-09 00:00 0次阅读
零基础Python入门教程二

C#良好兼容了值类型/引用类型

反观历史,C#也曾经因为 值类型/引用类型 保守诟病,“拆箱”和“装箱”一直是个招黑的设计。但后来我....
发表于 2020-11-20 10:14 65次阅读
C#良好兼容了值类型/引用类型

Python逐渐失去魅力

自从20世纪90年代初发布以来,Python一直相当火爆,在这二十多年里,它的流行程度远远超过了C、....
发表于 2020-11-19 11:05 145次阅读
Python逐渐失去魅力

Python20年来首次超越Java

根据 2020 年 11 月最新出炉的 TIOBE 编程语言排行榜,Python 以 12.12% ....
发表于 2020-11-16 11:28 267次阅读
Python20年来首次超越Java

请问python文件怎么操作?

python文件的操作步骤
发表于 2020-11-16 07:53 0次阅读
请问python文件怎么操作?

【编测编学】零基础学python_04_字符串(删除空白)分析

删除字符串中的空白: 在程序中,额外的空白可能令人迷惑。对程序员来说,'python' 和'python ' 看起来几乎没什么...
发表于 2020-11-14 11:24 404次阅读
【编测编学】零基础学python_04_字符串(删除空白)分析

出现ImportError: No module named PyQt4.QtGui的解决方法

将python3.7版本环境(图中前两个)上移到最上层,用户变量和系统变量都要调。...
发表于 2020-11-14 00:03 101次阅读
出现ImportError: No module named PyQt4.QtGui的解决方法

Python 之父正式加入微软

11月13日消息 去年 10 月, Python 创始人 Guido van Rossum 在 Dr....
发表于 2020-11-13 17:39 315次阅读
Python 之父正式加入微软

【MaaXBoard开发板试用体验】十运行python程序建立web网站

一直想在kindle电子书屏幕上作为树莓派或者maaxboard开发板的显示器,刷新速度虽然慢,但是编程调试够用。 之前了解...
发表于 2020-11-13 15:09 202次阅读
【MaaXBoard开发板试用体验】十运行python程序建立web网站

Python 创始人复出 宣布已加入微软开发者部...

去年 10 月, Python 创始人 Guido van Rossum 在 Dropbox 公司工....
发表于 2020-11-13 11:41 250次阅读
Python 创始人复出 宣布已加入微软开发者部...

人工智能行业,编程学习是Python还是C++好...

很多想要进入人工智能行业的开发者都会纠结于学习Python还是学习C++。有些人认为,Python目....
发表于 2020-11-13 09:29 279次阅读
人工智能行业,编程学习是Python还是C++好...

零基础学python_03_字符串(拼接+换行+制表符)

字符串拼接 在编码的过程很多时候都会用到字符串的拼接,例如,你可能想将姓和名存储在不同的变量中,等要显示姓名时...
发表于 2020-11-11 15:30 303次阅读
零基础学python_03_字符串(拼接+换行+制表符)

不再低调,QuecPython横空出世

移远通信正式推出一套轻松上手、功能完善的嵌入式操作系统——QuecPython,可让客户基于移远模组....
发表于 2020-11-11 11:49 515次阅读
不再低调,QuecPython横空出世

如何用Python给头像添加国旗?

用Python给头像添加国旗的方法
发表于 2020-11-11 08:02 0次阅读
如何用Python给头像添加国旗?

求python小案例demo01?

python小案例demo01
发表于 2020-11-10 07:18 0次阅读
求python小案例demo01?

Python仍是人工智能和机器学习的主导编程语言...

上世纪90年代初,Python面世了。近30年来,关于它的“炒作”一直没有少过。当然,编程界花了至少....
发表于 2020-11-09 14:30 451次阅读
Python仍是人工智能和机器学习的主导编程语言...

请问Python中的类方法、实例方法和静态方法是什么?

Python中的类方法、实例方法和静态方法
发表于 2020-11-09 07:13 0次阅读
请问Python中的类方法、实例方法和静态方法是什么?

最新的编程语言排行说明Python冲上第二

本月的排行榜出现了自 TIOBE 榜单发布以来,近二十年从未见过的变化:前两名的位置首次出现了一个除....
发表于 2020-11-07 10:54 383次阅读
最新的编程语言排行说明Python冲上第二

怎样使用Python创建词云

介绍从开始从事数据可视化工作的那一天起,我就爱上它了,我总是喜欢从数据中获得有用的见解。在此之前,我....
发表于 2020-11-06 17:26 296次阅读
怎样使用Python创建词云

高焕堂老师《AI概论:来来来,成为AI的良师益友》(全文)

这是一本非常基础的 AI 入门书籍。AI 的与会比传统IT(信息)有趣的地方是,当今 AI 的基础是:机器学习(Machi...
发表于 2020-11-06 17:25 909次阅读
高焕堂老师《AI概论:来来来,成为AI的良师益友》(全文)

请问Python中如何实现vlookup函数的功能?

vlookup函数功能非常强大,那在Python中如何实现?...
发表于 2020-11-06 06:11 0次阅读
请问Python中如何实现vlookup函数的功能?

Python3.9的新特性必知图

Python3.9,「千呼万唤始出来」。 先来速看下此次发布版本的重点。 新语法特性: PEP 58....
发表于 2020-11-05 15:33 332次阅读
Python3.9的新特性必知图

Python 在未来十年内仍是机器学习的首选语言

愚者多怨,仁者不言,生活中就是会有很多爱唱反调的人,但不管怎么说Python 在接下来十年仍然会很重....
发表于 2020-11-05 14:38 303次阅读
Python 在未来十年内仍是机器学习的首选语言

能够指挥AI机器的编程网红Python,被誉为“...

在这样的背景之下,我国也非常重视Python的教育:浙江已经把Python列为中学生必修项目;山东、....
发表于 2020-11-05 14:09 520次阅读
能够指挥AI机器的编程网红Python,被誉为“...

20年来首次:Java被编程语言 Python超...

日前,TIOBE公布了最新一期的编程语言排行榜(11月)。 接近20年来的首次,Java和C没有分享....
发表于 2020-11-05 13:28 313次阅读
20年来首次:Java被编程语言 Python超...

20年来首次。Java掉出全球最受欢迎的两大编程...

日前,TIOBE公布了最新一期的编程语言排行榜(11月)。接近20年来的首次,Java和C没有分享前....
发表于 2020-11-05 12:11 204次阅读
20年来首次。Java掉出全球最受欢迎的两大编程...

如何利用Python判断统计每个月天数源

如何利用Python判断统计每个月天数源。在日常的学习或是工作中会经常遇到需要统计日期数据的情况。特....
发表于 2020-11-02 09:41 345次阅读
如何利用Python判断统计每个月天数源

如何基于 ES6 的 JavaScript 进行...

TensorFlow.js 是 TensorFlow 的 JavaScript 版本,支持 GPU ....
发表于 2020-10-31 11:16 574次阅读
如何基于 ES6 的 JavaScript 进行...

在Python中实现异步编程(附源码)

异步编程是并行编程的一种方式。单个工作单元独立于主应用程序线程运行,并通知调用线程其完成、失败情况或....
发表于 2020-10-27 14:36 363次阅读
在Python中实现异步编程(附源码)

世界上最深奥的编程语言有哪些

当我们谈论 c,c++ ,Java,Python的时候,有些语言不仅很难,而且对于大多数软件开发者来....
发表于 2020-10-25 10:13 327次阅读
世界上最深奥的编程语言有哪些

TIOBE已公布2020年10月的编程语言排行榜

Python从去年开始就已经登上了TIOBE榜单的第三位,但它的受欢迎程度一直在上升,本月,该指数达....
发表于 2020-10-23 10:41 5783次阅读
TIOBE已公布2020年10月的编程语言排行榜

Python受欢迎程度直上升 即将超过Java

来自:程序猿(ID:imkuqin) TIOBE已公布2020年10月的编程语言排行榜。C语言依然排....
发表于 2020-10-23 10:41 400次阅读
Python受欢迎程度直上升 即将超过Java

Go为什么是2020年最受欢迎的语言?

在接下来的几年中,Python无疑还将继续在这些领域占据主导地位。但是,与一些新兴语言相比,它存在一....
发表于 2020-10-23 10:37 357次阅读
Go为什么是2020年最受欢迎的语言?

STM32的backtrace深度讲解(cort...

STM32上的backtrace原理与分析 1.说明 2.cortex-m上的栈布局 2.1 cor....
发表于 2020-10-22 15:13 576次阅读
STM32的backtrace深度讲解(cort...

2020年10月编程语言排行榜:Python即将...

来源:菜鸟教程 TIOBE 2020 年 10 月份的编程语言排行榜已经公布,官方的标题是:Pyth....
发表于 2020-10-19 11:37 521次阅读
2020年10月编程语言排行榜:Python即将...

为什么一定要学Python 答案太扎心了

今年秋招太难了。毕业生们纷纷表示心酸: 投了100份简历,面试邀请为0;别说大公司了,就连名不见经传....
发表于 2020-10-13 17:36 356次阅读
为什么一定要学Python  答案太扎心了

集中讨论谷歌、亚马逊等技术巨头使用Python开...

十年前,由于编程语言种类匮乏,开发人员不必苦恼自己应该选择哪一种编程语言;但是现在,世界上正在使用的....
发表于 2020-10-11 09:51 550次阅读
集中讨论谷歌、亚马逊等技术巨头使用Python开...

Python编程已经走进中小学课堂

在编程世界,关于哪个语言是最好的争论从未停止,虽然道理谁也不服谁,但是关于编程的热度,我们可以从TI....
发表于 2020-10-10 17:10 400次阅读
Python编程已经走进中小学课堂

如何系统型的学习深度学习?

更要命的是,我发现我一直都是在写算法,从没考虑过如何部署模型,也就是整天纸上谈兵。所以我最近开始学网....
发表于 2020-10-10 10:39 367次阅读
如何系统型的学习深度学习?

10个流行的Python库平台

作为开发人员喜爱的语言之一,Python以其丰富的社区可用工具和库而闻名。我们列出了开发人员可以用于....
发表于 2020-10-09 16:33 314次阅读
10个流行的Python库平台

Python在人工智能领域为什么如此受欢迎?

人工智能已成为我们日常生活不可或缺的一部分,它被广泛地应用到几百种实际场景中,极大地便利人们的工作和....
发表于 2020-09-30 11:09 470次阅读
Python在人工智能领域为什么如此受欢迎?
博评网