当前位置: 首页 > 后端技术 > Python

Python依赖库管理哪一个比较好?pipreqs、pigar、pip-tools、pipdeptree任你选

时间:2023-03-26 12:00:02 Python

在一个Python项目中,如何管理所有使用的依赖库?最主流的做法是维护一个“requirements.txt”,记录依赖库的名称和版本号。那么,如何生成这个文件呢?在上一篇《由浅入深:Python 中如何实现自动导入缺失的库?》中,我提到了一个常规的方法:pipfreeze>requirements.txt这个方法使用方便,但是有几个缺点:它查找依赖库的范围是全局环境,所以会把添加项目外的库造成冗余(通常在虚拟环境中使用,但可能仍然包含不相关的依赖库)。它只会记录“pipinstall”安装的库及其对依赖库的依赖关系,不做区分,不能判断版本差异和循环依赖……有很多工具可以用于项目依赖管理。本文主要关注与requirements.txt文件相关的四个相似但各有特点的三方。库,简要介绍如何使用,并列出一些值得注意的功能点。至于哪个是最好的管理方案?请记住,请继续阅读...pipreqs这是一个非常流行的用于管理项目中的依赖库的工具,可以使用“pipinstallpipreqs”命令进行安装。其主要特点是:搜索依赖库的范围是基于目录的,非常有针对性的搜索依据是脚本中导入的内容可以在没有安装依赖库的环境下生成依赖文件。查找软件包信息时,可以指定查询方式(只在本地查询,在PyPi中查询,或者在自定义PyPi中服务)基本命令选项如下:Usage:pipreqs[options]Options:--use-local仅使用本地包信息而不是查询PyPI--pypi-server使用自定义PyPi服务器--proxy使用代理,参数将传递给请求库。您也可以只在终端中设置环境参数:$exportHTTP_PROXY="http://10.10.1.10:3128"$exportHTTPS_PROXY="https://10.10.1.10:1080"--debug打印调试信息--ignore...忽略额外的目录--encoding使用编码参数打开文件--savepath在给定文件中保存需求列表--print输出标准o中的需求列表output--forceOverwriteexistingrequirements.txt--diff将requirements.txt中的模块与项目导入进行比较。--clean通过删除未在项目中导入的模块来清理requirements.txt。注意,很有可能遇到编码错误:UnicodeDecodeError:'gbk'codeccan'tdecodebyte0xaeinTheencodingformat"--encoding=utf8"needstobespecified.在已经生成依赖文件“requirements.txt”的情况下,可以强制覆盖,比较差异,清理不用的依赖。pigarpigar还可以根据项目路径生成依赖文件,并会在文件中列出使用依赖库的位置。此功能充分利用了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-toolspip-tools包含了一套管理项目依赖的工具:pip-compile和pip-sync,可以使用命令“pipinstallpip-tools”统一安装。它最大的优点是可以精确控制项目的依赖库。两个工具的用途及关系图如下:pip-compile命令主要用于生成依赖文件和升级依赖库。另外可以支持pip的“Hash-CheckingMode”,支持在一个依赖文件文件中嵌套其他依赖(比如在requirements.in文件中,可以使用“-crequirements.txt”引入一个依赖文件).它可以根据setup.py文件生成requirements.txt。如果"install_requires=['Flask']"写在一个Flask项目的setup.py文件中,那么你可以使用命令来生成它的所有依赖:$pip-compile##Thisfileisautogeneratedbypip-compile#要更新,请运行:##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.txtpipdeptree它的主要目的是显示Python项目的依赖树,通过一种分层缩进格式,显示它们的依赖关系,不像以前的工具只能生成平面并列。此外,它还可以:生成一个普遍适用的requirements.txt文件,反向查找依赖库是如何导入的,提示冲突的依赖库,发现循环依赖,报警生成各种格式的依赖树文件(json,graph,pdf、png等)它也有缺点,比如无法穿透虚拟环境。如果您想在虚拟环境中工作,则必须在该虚拟环境中安装pipdeptree。由于虚拟环境之间可能存在重复或冲突,因此需要对虚拟环境进行界定。但是在每个虚拟环境中安装一个pipdeptree是相当不舒服的。好了,四个库的介绍就完成了。它们的核心功能是分析依赖库并生成requirements.txt文件。同时,它们也有一些区别,弥补了传统pip的一些不足。本文不对它们进行全面的评测,仅选取部分主要特性进行介绍。幸运的是,它们易于安装(pipinstallxxx)且易于使用。感兴趣的同学不妨一试。更多细节请参考官方文档:https://github.com/bndr/pipreqshttps://github.com/damnever/pigarhttps://github.com/jazzband/pip-toolshttps://github.com/naiquevin/pipdeptree公众号【Python猫】,本号连载系列精品文章,包括喵星哲学猫系列、Python进阶系列、好书推荐系列、技术写作、优质英文推荐与翻译、等欢迎关注哦。