Python 依靠库治理哪家强?pipreqs、pigar、pip-tools、pipdeptree 任君遴选
2019-11-18杂谈搜奇网36°c
A+ A-在 Python 的项目中,怎样治理所用的悉数依靠库呢?最主流的做法是保护一份“requirements.txt”,纪录下依靠库的名字及其版本号。
那末,怎样来生成这份文件呢?在上篇文章《由浅入深:Python 中怎样完成自动导入缺失的库?》中,我提到了一种通例的要领:
pip freeze > requirements.txt
这类要领用起来轻易,但有几点不足:
- 它搜刮依靠库的局限是全局环境,因而会把项目以外的库到场进来,形成冗余(平常是在虚拟环境中运用,但照样能够包括无关的依靠库)
- 它只会纪录以“pip install”体式格局装置的库
- 它对依靠库之间的依靠关联不做辨别
- 它没法推断版本差别及轮回依靠等状况
- …………
可用于项目依靠治理的东西有许多,本文重要缭绕与 requirements.txt 文件相干的、比较类似却又各具特色的 4 个三方库,扼要引见它们的运用要领,排列一些明显的功用点。至于哪一个是最好的治理计划呢?卖个关子,请往下看……
pipreqs
这是个很受迎接的用于治理项目中依靠库的东西,能够用“pip install pipreqs”敕令来装置。它的重要特点有:
- 搜刮依靠库的局限是基于目次的体式格局,很有针对性
- 搜刮的依据是剧本中所 import 的内容
- 能够在未装置依靠库的环境上生成依靠文件
- 查找软件包信息时,能够指定查询体式格局(只在当地查询、在 PyPi 查询、或许在自定义的 PyPi 效劳)
基础的敕令选项以下:
Usage:
pipreqs [options] <path>
Options:
--use-local Use ONLY local package info instead of querying PyPI
--pypi-server <url> Use custom PyPi server
--proxy <url> Use Proxy, parameter will be passed to requests library. You can also just set the
environments parameter in your terminal:
$ export HTTP_PROXY="http://10.10.1.10:3128"
$ export HTTPS_PROXY="https://10.10.1.10:1080"
--debug Print debug information
--ignore <dirs>... Ignore extra directories
--encoding <charset> Use encoding parameter for file open
--savepath <file> Save the list of requirements in the given file
--print Output the list of requirements in the standard output
--force Overwrite existing requirements.txt
--diff <file> Compare modules in requirements.txt to project imports.
--clean <file> Clean up requirements.txt by removing modules that are not imported in project.
个中需注重,极能够碰到编码毛病:UnicodeDecodeError: 'gbk' codec can't decode byte 0xae in
。须要指定编码花样“--encoding=utf8”。
在已生成依靠文件“requirements.txt”的状况下,它能够强行掩盖、比对差别以及消灭不再运用的依靠项。
pigar
pigar 一样能够依据项目途径来生成依靠文件,而且会列出依靠库在文件中哪些位置运用到了。这个功用充分利用了 requirements.txt 文件中的解释,能够供应很雄厚的信息。
pigar 关于查询实在的导入源很有协助,比方bs4
模块来自beautifulsoup4
库,MySQLdb
则来自于MySQL_Python
库。能够经由过程“-s”参数,查找实在的依靠库。
$ pigar -s bs4 MySQLdb
它运用剖析 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
民众号【Python猫】, 本号连载优良的系列文章,有喵星哲学猫系列、Python进阶系列、好书引荐系列、手艺写作、优良英文引荐与翻译等等,迎接关注哦。