pip 批量完全卸载包

article/2025/9/19 0:49:55

pip 批量完全卸载包

    • 创作背景
    • 问题分析
    • 解决方法
    • 代码详解
    • 改 BUG
    • 结尾

创作背景

因为我本机环境中安装的第三方库太多了,所以今天我准备把它们都卸载了,但因为太多了,所以不可能手动一个一个来,于是我便写了个小脚本,本文就记录这个脚本的作用及使用。

如果觉得我这篇文章写的好的话,能不能给我 点个赞评论收藏 一条龙(☆▽☆)。如果要点个 关注 的话也不是不可以🤗。

请各位参加一下文末的 投票 哦,如果 有什么不足之处,还 请各位大佬在评论区提出,不胜感激。

问题分析

要实现上述功能,我们需要解决以下问题:

  1. 获取所有已安装的包
  2. 获取每个包的依赖
  3. 命令行交互,卸载指定包

解决方法

上述三个问题均可以使用 subprocess.Popen 包进行解决。为了方便,第三问题使用 subprocess.run 解决。
网上已经有好多文章都对 subprocess.Popensubprocess.run 的参数进行解释,这里不多赘述。
对于 subprocess.Popen ,除了要执行的命令外,我只设置了 stdinstdoutstderr 参数。
对于subprocess.run ,除了要执行的命令外,我只设置了如下参数:

  • universal_newlines ,设置输入输出的数据类型,True 为字符串,否则为字节串。
  • capture_output ,设置是否显示命令执行结果,True 显示,否则不显示。
  • input ,这个是关键,使得代码可以与命令行进行交互,即指定命令后,在命令行输入内容执行。在本文中的作用是执行 pip uninstall 【包名】 后输入 y 进行确定。

代码详解

首先导入所需的库:resubprocess
然后将卸载一个包的代码封装成一个函数,如下(本菜鸡代码水平不足,还请各位大佬指出问题):

def uninstall_completely(name):# 必备的或不需要卸载的库,可以自行设置skips = ['pip', 'urllib3', 'setuptools', 'wheel']if name in skips or name.startswith('-'):returnprint(f'Start to uninstall {name}')# 初始化 Popen,读取命令 pip show 【包名】 的执行结果pipe = subprocess.Popen(f'pip show {name}', stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE)# 如果没有安装该包,则退出if b'WARNING: Package(s) not found: ' in pipe.stderr.read():print(f'An error occurred when uninstalling {name}: {name} 不存在\n')return# 正则匹配获得所有依赖包名# stdout.read() 的结果是字节串,需要转换为字符串requirements = ''.join(re.findall('Requires: (.*?)\r\n', pipe.stdout.read().decode()))print(f"{name}'s requirements: {requirements}")# 关闭命令行pipe.terminate()# 卸载指定包try:# 执行命令 pip uninstall 【包名】# 执行命令后需要输入是否卸载 [y/n],因为要卸载,所以指定 input 参数为 'y'obj = subprocess.run(f'pip uninstall {name}', universal_newlines=True, capture_output=True, input='y')# 如果出错,则输出报错原因if not obj.stderr == '':print(obj.stderr)return# 否则卸载成功else:print(f'Uninstall {name} successfully.')# 防止中途报错导致程序停止运行except Exception as e:print(f'An error occurred when uninstalling {name}: {e}')# 输出结果分隔print('-------------------------------------------')# 卸载指定包的所有依赖包,递归调用本函数for _ in requirements.split(', '):if r == '':continueuninstall_completely(_)

调用函数代码如下:

for line in subprocess.Popen('pip list', stdout=subprocess.PIPE).stdout.read().decode().split('\n')[2:]:name = line.split(' ')[0]if name == '':continueuninstall_completely(name)

其中:

  • pip list 可以查看当前安装的所有包。
  • .decode() 是因为 stdout.read() 的结果是字节串,需要将其转为字符串。
  • [2:] 去除如下图所示的无用行
    在这里插入图片描述
    如果只卸载单个包的话,直接调用函数。
    如果卸载部分包的话,遍历列表并分别调用函数。

改 BUG

写代码的时候 BUG 并不少见,但这次挺少的。出错的原因是读取执行结果时编码错误导致。
具体过程为 run 函数中调用 Popen.communicate() 函数,如下:

with Popen(*popenargs, **kwargs) as process:try:stdout, stderr = process.communicate(input, timeout=timeout)except TimeoutExpired as exc:process.kill()

然后调用 Popen._communicate() 函数,如下:

try:stdout, stderr = self._communicate(input, endtime, timeout)
except KeyboardInterrupt:...

又调用 Popen._readerthread() 函数,如下:

self.stdout_thread = threading.Thread(target=self._readerthread, args=(self.stdout, self._stdout_buff))

看一下 Popen._readerthread() ,如下:

def _readerthread(self, fh, buffer):buffer.append(fh.read())fh.close()

此时会从 Popen.stdout 中读取命令执行结果。

再看一下 Popen.stdout 的初始化代码,如下:

self.text_mode = encoding or errors or text or universal_newlines
...
self.stdout = io.open(c2pread, 'rb', bufsize)
if self.text_mode:self.stdout = io.TextIOWrapper(self.stdout, encoding=encoding, errors=errors)

此时就明了了,如果指定了 encodingerrorstextuniversal_newlines 中任意一个或多个参数,就意味着输出的结果是 字符串 ,而如果没有指定 encoding 参数的话,默认是使用 gbk 编码,如果和环境中的编码方式不一致的话会导致编码报错。

那我们可以修改一下 Popen 的源码,在 subprocess 中第 767self.text_mode 的定义下一行加入如下代码:

if self.text_mode and encoding is None:encoding = sys.getdefaultencoding()

如果要将字节串转为字符串并且没有指定编码格式的话,就使用环境默认编码。




结尾

有想要一起学习 python 的小伙伴可以 私信我 进群哦。

以上就是我要分享的内容,因为 学识尚浅会有不足,还 请各位大佬指正
有什么问题也可在评论区留言。
在这里插入图片描述


http://chatgpt.dhexx.cn/article/MS2OGaX0.shtml

相关文章

【python】如何使用pip安装、卸载包

1、在安装python的时候要把pip勾选上(默认安装方式已经为你勾选好了)。这样你就已经安装了pip。 2、打开命令提示符窗口 开始→所有程序→附件→运行(快捷键 WinR),在对话框中输入cmd,回车确认即可 3.安装…

pip卸载库对应所有依赖库的解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

【pip command】之卸载 pip 之后重新安装

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言1 卸载 pip2 安装 pip3 查看 pip4 升级 pip总结 前言 提示:这里可以添加本文要记录的大概内容: 本来是一件没有必要的事情,但是…

已解决:不小心卸载pip后(重新安装pip的两种方式)

已解决:不小心卸载pip后(手动安装pip的两种方式) 文章目录 报错问题检查pip是否真的被卸载了解决方法1(复杂)解决方法2(简单推荐使用)千人全栈VIP答疑群联系博主帮忙解决报错 报错问题 一个粉丝…

Python基础:pip的安装与卸载

一、pip的安装: winR出现一下界面 然后输入cmd点击确定,出现以下界面,就可进行下载 以下是两种下载方法 1、普通安装:pip install 模板名 2、指定版本安装:pip install 模板名版本 二、pip的卸载:pip un…

已解决卸载pip重新安装的方法

已解决卸载pip重新安装的方法 文章目录 问题需求卸载pip安装pip千人全栈VIP答疑群联系博主帮忙解决报错 问题需求 粉丝群里面的一个小伙伴遇到问题跑来私信我,想用卸载pip重新安装pip,但是发生了报错(当时他心里瞬间凉了一大截,跑…

php mysql stmt_PHP的mysqli_stmt_init()函数讲解

PHP mysqli_stmt_init() 函数 初始化声明并返回 mysqli_stmt_prepare() 使用的对象: // 假定数据库用户名:root,密码:123456,数据库:codingdict $conmysqli_connect("localhost","root"…

mysql_stmt_precheck_COM_STMT_PREPARE 1

mysqld_stmt_preparevoid mysqld_stmt_prepare(THD*thd,const char *query,uintlength, Prepared_statement*stmt ) 功能: COM_STMT_PREPARE handler. 给定带有参数标志的查询字符串,从中创建预处理语句并将PS发送给客户端。 如果在查询中找到参数标志&a…

续上篇文章中的stmt使用方法。

由于既然写就把不懂的捣鼓明白,这也是我一直有的问题,可能是个假程序猿,强迫自己去搞明白。 stmt介绍: MySQL从4.1版本开始提供了一种名为预处理语句(prepared statement)的机制。它可以将整个命令向MySQL服务器发送…

Sqlite3 stmt 机制操作

参考文献:https://blog.csdn.net/u012351051/category_8966045.html sqlite 提供了SQL语句执行的函数sqlite3_exec,本文介绍的是sqlite3_stmt方式对数据库进行操作。 官方文档以及参考资料中给出的结论:如果只是单条命令,那么 使用…

sqlite stmt

转载:http://www.sqlite.org/syntaxdiagrams.htm Syntax Diagrams For SQLite sql-stmt-list: References: sql-stmt See also: lang.html sql-stmt: Used by: sql-stmt-list References: alter-table-stmt analyze-stmt attach-stmt begin-st…

【STMT】判定表法

文章目录 判定表法题目解答 判定表法 判定表(Desision table)用于表示和分析复杂的逻辑关系,描述了在不同条件(Condition)下执行的动作(Action)集合。判定表本质上就是真值表的扩展,每个条件由两种可能的赋值扩展到多种可能的赋值,并且可以通…

MATLAB绘制折线图和散点图

折线图: >> a[1.3,-0.1,-0.3,0.4,0.1,-0.4,0.2,0.3,0.2,0.3,-0.1,0.5]; >> x1:1:12;%第一个数是起始,最后一个数是最后一个数据,第二个数是间隔 >> plot(x,a,-*)%先x轴后y轴,第三个是点的形状散点图…

matlab画论文实验图——01折线图(标记数据点,添加误差条)

为了减少以后画图的工作量,把现在画的图总结成模板,方便以后引用或者调整 1、基础的折线图 代码如下,代码有详细的注释,方便调整。 %linestyle,linewidth,marker,color等等都可以在属性里随时修改,这就是…

Matplotlib画折线图

Matplotlib画折线图 有一些离散点,想看看这些点的变动趋势: import matplotlib.pyplot as pltx1 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13] y1[30,31,31,32,33,35,35,40,47,62,99,186,480]x2 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14] y…

matlab绘制多条折线图

%绘制多条折线图 clear clc n 12; x 1:n; C 10 * rand(n,1); A 10 * rand(n,1); J 10 * rand(n,1); figure; plot(x,C,s-,x,A,s-.,x,J,s--); legend(C,A,J); 效果:

matlab中怎么画函数曲线,用matlab 怎么画函数曲线图

matlab的数据处理能力很强大,这款软件还能绘制各种函数图形。下面我将介绍用matlab画函数图形的方法,以在同一张图上画出y1sin(x)和y2sin^2(x)的图形为例。 工具/原料 matlab 1方法/步骤 输入自变量: 画已知的函数图形,用向量的方…

Python Matlab绘制曲线图

Python Matlab绘制曲线图 文章目录 Python Matlab绘制曲线图一、简介二、绘制图形1、第一个曲线图2、第二个图形3、第三个图形4、第四个图形 一、简介 我们在这里采用Python中的matplotlib来实现曲线图形的绘制。 二、绘制图形 1、第一个曲线图 代码: 具体的绘…

matlab绘制图像的直方图、杆状图和折线图等

1.imhist函数: himhist(f,b) 其中,f为输入图像,h是该图像的直方图数据,b是用来形成直方图的“容器”数目,即把所有灰度级分成几份的数量(b默认为256)。若按上面一行代码中使用imhist函数,则并…

matlab绘制折线图

参考了别人文章画出了稍微好看一点的折线图 下面是代码 x1:1:9;%x轴上的数据,第一个值代表数据开始,第二个值代表间隔,第三个值代表终止 name{F1,F4,F5,F6,F8,F9,F10,F17,F18}; %横坐标字符 a[0.8201,0.6783,0.8568,0.962,0.2922,0.69,0.844…