Javatpoint标志
Javatpoint标志

Python中的Broken Pipe错误

如今,Python被认为是一种成熟的编程语言,由于其简单易懂的语法,被数据科学家和人工智能(AI)工程师广泛使用。除此之外,编程语言的模糊错误通常会让新程序员费尽心思去调试。

在下面的教程中,我们将讨论[Errno 32]管道破裂,我们在与文件系统交互时经常看到的一个著名的错误消息。我们还将了解这种情况的原因,以及在代码中避免它和修复它的方法。

在Python中是什么原因导致“[Errno 32] Broken pipe”?

“Broken pipe”通常被认为是一个IOError(简称输入/输出错误)错误,该错误发生在Linux系统级别。它通常在读取和写入文件时抛出,或者在执行文件输入/输出或网络输入/输出(通过套接字)时抛出。

Linux系统的等效错误是EPIPE,摘自GNU libc错误代码。

宏观:intEPIPE

“破裂的管道”,没有从管道的另一端读取的进程。库的每一个函数都会产生错误代码SIGPIPE信号;这个信号如果没有被处理或阻止,将终止程序。因此,程序将永远不会实际显示EPIPE直到它被处理或阻塞SIGPIPE。

从上面的陈述,我们可以得出结论,系统发送SIGPIPE信号导致[Errno 32]管道破裂error是Linux的一种进程间通信机制。

例如,Linux系统使用另一种名为信号情报在内部。在Linux中,命令Ctrl + C会发送一个信号情报信号来结束这个过程,或者我们可以利用杀了命令才能达到同样的效果。

Python不会忽略SIGPIPE默认情况下。但是,它将信号转换为异常并引发错误- IOError: [Errno 32]管道破裂每次它接收到一个SIGPIPE。

在Linux终端中使用管道导致管道破裂错误

每当我们遇到[Errno 32]管道破裂当试图将Python脚本的输出输出到另一个程序时,会出现错误,如下例所示:

例子:

解释:

上述管道语法将创建一个向上游发送数据的进程和一个向下游读取数据的进程。当下游不需要读取上游数据时,它会向上游进程发送SIGPIPE信号。

什么时候下游不需要读取上游数据?让我们通过一个例子来理解这一点。的命令在本例中只需要读取足够多的行,以便告诉上游进程我们不再需要读取它,并且它将向上游进程发送SIGPIPE信号。

只要上游进程是一个Python程序,就会出现类似IOError: [Errno 32]管道破裂将会发生。

如何避免断管错误?

如果我们不关心如何正确地捕获SIGPIPE,并且必须让程序快速运行,那么可以将下面的代码段插入到Python程序的顶部。

语法:

解释:

在上面的代码片段中,我们重定向了SIGPIPE默认信号SIG_DFL,系统通常会忽略。

但是,建议注意信号库上的Python手册,以警告不要这样处理SIGPIPE。

正确捕获IOError以避免管道破裂错误

由于管道破裂错误是一个IOError错误,我们可以放置atry / catchBlock来捕获它,如下面的代码片段所示:

语法:

解释:

在上面的代码片段中,我们导入了sys和errno模块,并将try / catch块,以捕获引发的异常并处理它。

多进程程序中破管错误的可能解决方案

在利用工作进程来加快处理速度和利用多核cpu的程序中,我们可以尝试减少工作进程的数量,以检查错误是否仍然存在。

大量的工作进程在试图控制系统资源或权限以写入磁盘时可能会相互冲突。







Youtube 观看视频请加入我们的Youtube频道:现在加入

反馈


帮助他人,请分享

脸谱网 推特 pinterest

学习最新教程


准备


热门的技术


B.Tech / MCA






Baidu
map