Python 依赖库太多了,该怎么管理?

Python项目依赖管理:pipreqs vs pip freeze,哪个更适合你的项目? 本文深入对比了Python项目依赖管理的两种核心工具:pipreqs与pip freeze。pipreqs通过扫描源码生成最小化依赖清单,适合声明项目意图;而pip freeze则记录环境的精确快照,确保绝对可复现性。文章分析了各自的优劣、适用场景,并推荐结合使用或采用pip-tools等进阶方案,以构建清晰、可靠的依赖管理流程。 阅读详情

后台回复【入门资料】

送你十本Python电子书

640

文 | 豌豆花下猫 公众号 | Python 猫

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

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 文件中的注释,可以提供很丰富的信息。

640?wx_fmt=gif

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”统一安装。它最大的优势是可以精准地控制项目的依赖库。

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

640?wx_fmt=jpeg

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 项目的依赖树,通过有层次的缩进格式,显示它们的依赖关系,不像前面那些工具只会生成扁平的并列关系。

640?wx_fmt=jpeg

除此之外,它还可以:

  • 生成普遍适用的 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

回复下方「关键词」,获取优质资源

回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版

回复关键词「入门资料」,立即获取主页君整理的 10 本 Python 入门书的电子版

回复关键词「m」,立即获取Python精选优质文章合集

回复关键词「book 数字」,将数字替换成 0 及以上数字,有惊喜好礼哦~

推荐阅读

题图:pexels,CC0 授权。

640?wx_fmt=jpeg

使用Pycharm管理Python依赖库(不使用anaconda) anaconda使用时出了一些问题,很头痛,故直接卸载。卸载后python库管理起来又不太方便,后来发现在Pycharm中也是可以管理python库的,而且还很好用,也很简单。 第一步,升级pip 不升级pip到最新版本在Pycharm中下载依赖库时会报错 python -m pip install --upgrade pip 第二步,在Pycharm中配置python 打开Pycharm,f... 阅读详情

相关推荐

用Zotero+B站Kimi,我如何把一篇顶会论文快速做成组会PPT(含完整提示词)

本文介绍如何利用Zotero和Kimi快速将顶会论文转化为组会PPT,提升学术汇报效率。通过Zotero的文献管理插件和Kimi的AI提炼技术,实现从论文阅读到PPT生成的全流程自动化,帮助研究者在90分钟内完成高质量汇报准备。

weixin_30955617的博客 504

[729]Python依赖包管理工具pipreqs、pip-tools

你不知道直接或间接安装了哪些依赖项,因此现在更新甚至删除 F 成为一个问题,因为你必须搜索才能知道 G 是作为子依赖项安装的。一段时间后,在 requirements.txt 中看到的只是 A、B、C、D、E、F、G、H 作为你的依赖项。为了解决这个问题,许多聪明人想出了更好的方法来管理 Python 中的依赖项。在本文中,我们将分享如何使用 pip-tools 的一个可靠示例,说明如何从项目开始就管理依赖项。会生成当前python环境安装的所有安装包,生成的文件名可以任意命名,安装的时候也要用这个名字。

周小董 5392

如何在R中高效安装ropls及其依赖包

本文详细介绍了在R语言中高效安装ropls包及其依赖的完整流程。作为Bioconductor生物信息学分析包,ropls的安装需通过BiocManager管理器进行。文章提供了标准安装步骤、跨系统避坑指南及安装后验证方法,帮助用户解决R版本、编译环境和网络镜像等常见问题,确保代谢组学数据分析工具顺利部署。

efc123456的博客 908

利用pip和pipreqs导出当前python环境下所依赖的包总结

引言 很多时候我们会去GitHub上找项目,或者说从其它的地方找到相关的代码,然后有一些已经帮忙做好了requirements文本,我们只需要利用pip就可以进行安装,但还有一部分其实是没有的,所以我们必须要通过其它的方式来得到我们想要的所有依赖。 生成依赖方式 当我们拿到一份较为完整的项目代码时,项目的根目录下是一定会有一个requirements文本文件的,这是作为有利于自己总结当前使用了多...

submarineas的博客 3332

(超详细)Scala环境搭建(scala-2.12.15、IDEA2021.1.3)

Scala环境搭建(scala-2.12.15、IDEA2021.1.3) JunLeon——go big or go home 目录 Scala环境搭建(scala-2.12.15、IDEA2021.1.3) 一、Scala概述 1、什么是Scala? 2、Scala发展史 3、Scala与Java的关系 二、Scala环境搭建 1、环境准备 2、Scala安装与配置环境变量 3、验证Scala 三、编写第一个Scala程序 1、使用IDEA创建maven工程 2、.

JunLeon的博客 3万+

matlab kwave模拟超声换能器学习笔记

kwave模拟超声换能器的学习笔记,从零开始造车轮

SolvingMaster的博客 3201

Python 依赖库管理哪家强?pipreqs、pigar、pip-tools、pipdeptree 任君挑选

在 Python 的项目中,如何管理所用的全部依赖库呢?最主流的做法是维护一份“requirements.txt”,记录下依赖库的名字及其版本号。 那么,如何来生成这份文件呢?在上篇文章《由浅入深:Python 中如何实现自动导入缺失的库?》中,我提到了一种常规的方法: pip freeze > requirements.txt 这种方法用起来方便,但有几点不足: 它搜索依赖库的范围是全...

Python猫 2391

《Ventoy 制作系统安装 U 盘的具体步骤》

然后您可以在电脑的磁盘管理中对 U 盘进行快速格式化,选择 FAT32 或 NTFS 文件系统。至此,Ventoy 系统安装 U 盘就制作完成了。您可以在需要安装系统的电脑上,从 U 盘启动,然后选择相应的系统镜像进行安装。安装完成后,将您需要的操作系统镜像文件(如 Windows、Linux 等的 ISO 格式镜像)复制到 U 盘的根目录。在安装程序中,选择您插入的 U 盘设备,确保选择正确,以免误操作。2. 确认选择的 U 盘盘符正确,防止误操作导致其他磁盘数据丢失。点击“安装”按钮,等待安装完成。

jiyiwangluokeji的博客 2675

Python使用pip、pipreqs导出包并离线安装

pip导出包: 该命令只能导出当前虚拟环境中安装的包 pip freeze > requirements.txt pipreqs导出包: 自动导出全局环境中的依赖包要安装pipreqs pip install pipreqs pipreqs ./ --force 离线文件导出: 从当前环境的网络中下载requestments.txt中写的包,下载到当前目录下的pip_packages目录中。 pip download -r requestments.txt -d ./pip_packag

薛定谔の丸 9525

解析 RABAX during SAPGUI Logon 错误及其解决方案

登录用户关联了初始启动程序,该程序由于未处理的异常导致运行时错误。在 ST22 查看错误的程序名和错误行。修复初始程序代码中的逻辑问题。重新部署修复后的代码。示例代码:防止未处理的异常TRY." 模拟逻辑处理ENDTRY.此代码通过 TRY-CATCH 块捕获潜在错误,避免程序崩溃。是 SAP 系统中常见的运行时错误,其根源可能涉及多个方面,包括用户配置、系统状态、数据库连接和自定义开发等。通过结合 ST22、SM21 等诊断工具,以及完善的代码实践和系统监控,可以有效预防和解决此类问题。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1785

CUDA&PCL 点云体素下采样

CUDA&PCL 点云体素下采样

dayuhaitang1的博客 1269

python有两个基本的库管理_Python 依赖库太多了该如何管理

在 Python 的项目中,如何管理所用的全部依赖库呢?最主流的做法是维护一份“requirements.txt”,记录下依赖库的名字及其版本号。那么,如何来生成这份文件呢?在上篇文章《由浅入深:Python 中如何实现自动导入缺失的库?》中,我提到了一种常规的方法:pip freeze>requirements.txt这种方法用起来方便,但有几点不足:它搜索依赖库的范围是全局环境,因此会把...

weixin_39671964的博客 323

《Python入门到精通》函数详解

函数就是一段「封装」起来的「代码」,目的是提高代码的「模块性」和「复用性」。 2、函数的参数 2.1、变量的就近原则 2.2、传递参数 2.3、形参和实参 2.4、位置参数 2.5、缺省参数 2.6、可变类型和不可变类型 2.7、关键字参数 3、匿名函数 4、函数的返回值

wangyuxiang946的博客 1万+

下载python依赖库

我整理的一些关于【Python】的项目学习资料(附讲解~~)和大家一起分享、学习一下:https://d.51cto.com/Hpqqk2如何下载 Python 依赖库 作为一名新手开发者,掌握如何管理和下载 Python 依赖库是非常重要的。Python 允许用户安装第三方库来扩展功能,这通常通过名为 pip 的包管理...

weixin_34985445的博客 1028

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

python依赖库管理及迁移

python依赖库管理及迁移WhyWhatHow使用conda及问题使用pip使用docker Why python的包特别多,这为我们带来了方便也造成了不变,主要问题如下: 开发环境迁移时,我们要将所有现有安装包再在新的机器上安装一遍; 已安装包在后续更新时变动较大,可能会影响现有代码。希望可以在不同环境下执行。 What 目前有三种 python 依赖包管理方式: conda ,相信大家...

听了个听儿 3263

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

python运行环境中快速部署依赖库的方法

本文主要介绍在pycharm 开发环境中,如何使用python命令,快速查看依赖库的方法,已经如何在一台新的运行环境中重新部署依赖库的方法。

mftang的博客 1884

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

anaconda自带python有哪些库_利用anaconda作为python的依赖库管理方法

python自带的pip管理依赖库太麻烦,pip很多库不存在,或者一些库并不支持window系统。而且每次用pip下载库经常不成功,结果还是要手动下载跟自己python对应的whl包安装库。遇到了很多坑之后,发现神奇anaconda,便查阅资料,整理好记录到这里1、下载anacondaanaconda可以提供了python的很多库管理,支持多个系统这里我下载了python3.6,64位window...

weixin_39969881的博客 4859

Python编程的十大神奇依赖库

Python是一门广受欢迎的编程语言,其生态系统丰富多彩,拥有许多令人惊叹的依赖库,可以帮助程序员们在各种领域中创造出令人瞠目结舌的应用。在这篇文章中,我们将探讨Python编程的十大神奇依赖库,它们像魔法一样,可以让编程变得更有趣。

xxue345678的博客 1549

管理python库的工具_Python如何管理所用的全部依赖库

在Python的项目中,如何管理所用的全部依赖库呢?最主流的做法是维护一份“requirements.txt”,记录下依赖库的名字及其版本号。那么,如何来生成这份文件呢?在上篇文章《由浅入深:Python中如何实现自动导入缺失的库?》中,我提到了一种常规的方法:pipfreeze>requirements.txt这种方法用起来方便,但有几点不足:•它搜索依赖库的范围是全局环境,因此会把项目之...

weixin_39890289的博客 252

Python依赖库的工作原理与机制解析

Python依赖库系统是Python生态的核心支撑,其管理机制经历了从简单到复杂的演进过程。本文系统阐述了Python依赖库的工作原理,包括模块查找机制(sys.path路径搜索)、加载流程(通过Finder和Loader协作)以及版本管理策略。详细解析了标准库与第三方库的区别,介绍了pip、pipenv、poetry等主流依赖管理工具的特点和冲突解决策略。文章还提出了虚拟环境隔离、版本锁定等最佳实践,并展望了依赖管理在安全性、可重复性方面的发展趋势,为开发者构建稳定的Python项目环境提供了系统指导。

tkdsy007的博客 995

python依赖库是什么_【转】python导出依赖库

原文链接:https://www.cnblogs.com/ceshixuexi/p/8283372.html在Python开发的过程中,经常会遇到各种各样的小问题,比如在一台计算机上调试好的程序,迁移到另外一台机子上后往往会应为工程项目依赖库的缺失而造成错误。除了一遍又一遍对着被抛出错误去重新install各种相关的依赖库,有没有更好的方法来解决Python开发过程中依赖库的打包呢?答案是肯定的。...

weixin_39932181的博客 1559

电脑中同时存在多个版本的Python,在指定版本中安装依赖库

例如我的电脑中同时安装了Python3.7.5和Python3.8.5,平时使用的是Python3.7.5,环境变量中Python3.7.5的位置排在Python3.8.5上面 如果直接输入 pip install XXX,此时安装的是Python3.7.5的依赖库,如果想要安装Python3.8.5的依赖库,输入 py -3.8 -m pip install XXX 查看Python安装了哪些依赖库 输入 pip list 显示的是Python3.7.5安装的依赖库 py -3.8 -m p

Scarlett的博客 3879

anaconda和python库通用_利用anaconda作为python的依赖库管理方法

python自带的pip管理依赖库太麻烦,pip很多库不存在,或者一些库并不支持window系统。而且每次用pip下载库经常不成功,结果还是要手动下载跟自己python对应的whl包安装库。遇到了很多坑之后,发现神奇anaconda,便查阅资料,整理好记录到这里1、下载anacondaanaconda可以提供了python的很多库管理,支持多个系统这里我下载了python3.6,64位window...

weixin_39665847的博客 328
上一篇: 原来我一直安装 Python 库的姿势都不对呀!
下一篇: Jupyter“慌了”!Netflix发布新开发工具Polynote
codingpy
博客等级 码龄11年 1873粉丝 104原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值