python 依赖库管理 包管理 pipreqs、pigar、pip-tools、pipdeptree 简介
目录
freeze
pipreqs
pigar
pip-tools
pipdeptree
freeze
在 Python 的项目中,如何管理所用的全部依赖库呢?最主流的做法是维护一份“requirements.txt”,记录下依赖库的名字及其版本号。
那么,如何来生成这份文件呢?在上篇文章《由浅入深:Python 中如何实现自动导入缺失的库?》中,我提到了一种常规的方法:
pip freeze > requirements.txt
这种方法用起来方便,但有几点不足:
- 它搜索依赖库的范围是全局环境,因此会把项目之外的库加入进来,造成冗余(一般是在虚拟环境中使用,但还是可能包含无关的依赖库)
- 它只会记录以“pip install”方式安装的库
- 它对依赖库之间的依赖关系不做区分
- 它无法判断版本差异及循环依赖等情况
- …………
可用于项目依赖管理的工具有很多,本文主要围绕与 requirements.txt 文件相关的、比较相似却又各具特色的 4 个三方库,简要介绍它们的使用方法,罗列一些显著的功能点。至于哪个是最好的管理方案呢?卖个关子,请往下看……
pipreqs
安装方式 pip3 install pipreqs
安装后如果找不到 pipreqs
使用命令查找
find /usr/local/ -name "pipreqs"
然后添加到PATH
export PATH=$PATH:/usr/local/python3.8.1/bin/
生成依赖文件 requirements.txt :pipreqs ./ --encoding=utf8
根据依赖文件安装项目依赖:pip3 install -r requirements.txt
新添依赖文件:pip freeze > requirements.txt
这是个很受欢迎的用于管理项目中依赖库的工具,可以用“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 theenvironments 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 ”,并支持在一个依赖文件中嵌套其它的依赖文件(例如,在 http://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 依赖库管理 包管理 pipreqs、pigar、pip-tools、pipdeptree 简介相关推荐
- python中有很多包管理工具那中不是_Python中的包管理工具PIP,pip
1.1.4节 -- Python的包管理工具pip pip包 pip list(退出python环境后再输入) 列出匹配管理的包有哪些 pip install 包名 安装一个包(默认安 ...
- Python 包管理工具:pip 用法详解 + 常用pip指令
pip 作为 python 包管理工具,在 python 引用第三方库的时候常常会使用到.那么 pip 怎么用呢,python 常用的 pip 指令有哪些?接下来这篇文章告诉你. 目录 阅前须知 第三 ...
- 关于Python虚拟环境与包管理你应该知道的事
关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...
- python卸载_Python包管理工具pip - amanlikethis
一.pip概述 包 python包,可以使我们利用网络上现成的代码库资源,解决程序中某一方面的问题,类似于C语言的各种库. PyPi(Python Package Index ,包索引) 是 Py ...
- python中有很多包管理工具、以下哪种不是_python试卷_共4页
1 Python 试卷 单选题 ( 每题 2 分,共 30 分 ) : 1. Python 使用缩进作为语法边界 , 一般建议怎样缩进 ? ( ) A.TAB B. 两个空格 C. 四个空格 D. ...
- Python安装第三方包package
一.安装Python下的包管理工具:pip(前往下载).若在安装Python的时候已经安装,则省略此步. 查看方法,在命令行下,输入pip命令,查看反馈结果便知. 提供两个可以下载的官网pip文件: ...
- ubuntu安装python下载包_Ubuntu安装Python的包管理工具Pip
CSDNGitHubUbuntu安装Python的包管理工具PipAderXCoding/system/tools/pip 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行 ...
- tensorflow2.3匹配python版本_Python 包安装和管理工具 pip 19.2 发布
Python 是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发. pip ...
- python 虚线_Python 包安装和管理工具 pip 19.2 发布
Python 是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越来越多被用于独立的.大型项目的开发. pip ...
最新文章
- mysql中Bname表示什么_《MY SQL实用教程》期末考试题
- jwPlayer实现支持IE8及以下版本避免出错的方法
- 大数据在医疗保健中的真正愿景
- How data type handler is got for AET extension field
- https 密钥 php,https加密方式是什么
- python中的property_python中的property属性
- (转)Arcgis for JS之地图自适应调整
- IOT(33)---NB-IOT通用物联解决方案
- linux下查看某个文件或目录占用磁盘空间的大小
- 前端—每天5道面试题(2)
- CCNA-(5)-IP路由汇总
- HTTP响应状态代码----客户端错误(400–499)
- js页面刷新事件 ,Javascript刷新页面的几种方法
- 预设Date时间格式化参数
- 【综合类型第 35 篇】程序员的七夕浪漫时刻
- 图形虚拟化技术为每个英特尔®显卡家族提供支持
- CString查找子字符串
- 状态压缩技巧:动态规划的降维打击
- 使用二维数组表示N阶矩阵
- Cris 玩转大数据系列之 Hadoop HA 实现
热门文章
- python coding_python开头的coding设置方法
- node.js安装模式 的区别_Nodejs入门篇(一)
- Linux Kernel TCP/IP Stack — L3 Layer — netfilter 框架
- ASCII、GB2312、GBK、Unicode、UTF-8介绍和转换
- 当我们在讨论奢侈品行业时,人工智能可以做什么?
- PE病毒初探——向exe注入代码
- Scala in depth 6 Scala的类型系统 上
- Delphi 中的 XMLDocument 类详解(5) - 获取元素内容
- Spring JdbcTemplate小结
- onclick事件中加href