在Python项目中,如何管理所有要使用的依赖库? 最常见的方法是保留“requirements.txt”,并记录从属库的名称及其版本号。
那么,如何生成这个文件呢? 在上一篇文章《由浅入深:Python 中如何实现自动导入缺失的库?》中,我谈到了常用的方法:
pip免费要求. txt
这个方法很好用,但有几个缺点。
由于搜索依存关系库的范围是全局环境,因此可以添加非项目库以提供冗余。 ……通常用于虚拟环境,但可能包含不相关的从属库。 它只记录以“pip install”方式安装的库,不区分依赖库之间的依赖关系就无法判断版本差异和循环依赖等。 ……有很多工具可以用于项目的依赖管理。 本文将围绕四个主要与requirements.txt文件相关的、比较相似但各具特色的三方库,简要介绍它们的使用方法,并列举几个显著的功能点。 哪个是最好的管理方案? 卖了关子,请看下面……
pipreqs
这是用于管理项目中依赖关系库的常用工具,可以使用pip install pipreqs命令安装。 主要特征如下
从属库的搜索范围基于目录,如果要根据脚本中的import内容在未安装从属库的环境中生成从属文件来搜索软件包信息,可以使用查询方法仅限本地、PyPi查询或自定义
Usage:
pipre QS选项路径
选项:
–use-localuseonlylocalpackageinfoinsteadofqueryingpypi
–pypi -服务器URLusecustompypiserver
—代理用户代理,参数化数据库. youcanalsojustsetthe
环境参数终端:
$导出http _代理=’ http://10.10.1.1033603128 ‘
$导出https _代理=’ https://10.10.1.1033601080 ‘
—调试打印调试信息
– -忽略目录.忽略目录
–encodingcharsetuseencodingparameterforfileopen
–savepathfilesavethelistofrequirementsinthegivenfile
–printoutputthelistofrequirementsinthestandardoutput
–forceoverwriteexistingrequirements.txt
–difffilecomparemodulesinrequirements.txttoprojectimports。
–cleanfilecleanuprequirements.txtbyremovingmodulesthatarenotimportedinproject
其中,请注意编码错误的可能性很高。 unicodedecodeerror : ‘ GBK ‘编解码器can ‘ TDecodebyte0x Aein。 必须指定编码格式“–encoding=utf8”。
生成依赖关系文件“requirements.txt”时,可以强制复盖、匹配差异或清除不再使用的依赖关系。
pigar
pigar也将基于项目路径生成依赖关系文件,并列出依赖关系库在文件中的哪个位置使用。 此功能利用requirements.txt文件中的注释提供了丰富的信息。
pigar有助于查询实际的导入源,如bs4模块是beautifulsoup4库,MySQLdb是MySQL_Python库等。 使用-s参数可以找到实际的依赖关系库。
$ pigar-s bs 4磁碟机
通过解析AST而不是正则表达式,可以从exec/eval的参数、文档字符串的文档测试中轻松提取依赖库。
另外,那是
不同 Python 版本的差异可以很好地支持。例如,concurrent.futures 是 Python 3.2+ 的标准库,而在之前早期版本中,需要安装三方库futures ,才能使用它。pigar 做到了有效地识别区分。(PS:pipreqs 也支持这个识别,详见这个合入:https://github.com/bndr/pipreqs/pull/80)
pip-tools
pip-tools 包含一组管理项目依赖的工具:pip-compile 与 pip-sync,可以使用命令“pip install pip-tools”统一安装。它最大的优势是可以精准地控制项目的依赖库。
两个工具的用途及关系图如下:
pip-compile 命令主要用于生成依赖文件和升级依赖库,另外它可以支持 pip 的“Hash-Checking Mode ”,并支持在一个依赖文件中嵌套其它的依赖文件(例如,在 requirements.in 文件内,可以用“-c requirements.txt”方式,引入一个依赖文件)。
它可以根据 setup.py 文件来生成 requirements.txt,假如一个 Flask 项目的 setup.py 文件中写了“install_requires=[‘Flask’]”,那么可以用命令来生成它的所有依赖:
$ pip-compile
#
# This file is autogenerated by pip-compile
# To update, run:
#
# pip-compile –output-file requirements.txt setup.py
#
click==6.7 # via flask
flask==0.12.2
itsdangerous==0.24 # via flask
jinja2==2.9.6 # via flask
markupsafe==1.0 # via jinja2
werkzeug==0.12.2 # via flask
在不使用 setup.py 文件的情况下,可以创建“requirements.in”,在里面写入“Flask”,再执行“pip-compile requirements.in”,可以达到跟前面一样的效果。
pip-sync 命令可以根据 requirements.txt 文件,来对虚拟环境中进行安装、升级或卸载依赖库(注意:除了 setuptools、pip 和 pip-tools 之外)。这样可以有针对性且按需精简地管理虚拟环境中的依赖库。
另外,该命令可以将多个“*.txt”依赖文件归并成一个:
$ pip-sync dev-requirements.txt requirements.txt
pipdeptree
它的主要用途是展示 Python 项目的依赖树,通过有层次的缩进格式,显示它们的依赖关系,不像前面那些工具只会生成扁平的并列关系。
除此之外,它还可以:
生成普遍适用的 requirements.txt 文件逆向查找某个依赖库是怎么引入进来的提示出相互冲突的依赖库可以发现循环依赖,进行告警生成多种格式的依赖树文件(json、graph、pdf、png等等)
它也有缺点,比如无法穿透虚拟环境。如果要在虚拟环境中工作,必须在该虚拟环境中安装 pipdeptree。因为跨虚拟环境会出现重复或冲突等情况,因此需要限定虚拟环境。但是每个虚拟环境都安装一个 pipdeptree,还是挺让人难受的。
好啦,4 种库介绍完毕,它们的核心功能都是分析依赖库,生成 requirements.txt 文件,同时,它们又具有一些差异,补齐了传统的 pip 的某些不足。
本文不对它们作全面的测评,只是选取了一些主要特性进行介绍,好在它们安装方便(pip install xxx),使用也简单,感兴趣的同学不妨一试。
更多丰富的细节,请查阅官方文档:
https://github.com/bndr/pipreqs
https://github.com/damnever/pigar
https://github.com/jazzband/pip-tools
https://github.com/naiquevin/pipdeptree