【问题标题】:IOError: [Errno 32] Broken pipeIOError:[Errno 32] 管道损坏
【发布时间】:2021-01-04 01:16:08
【问题描述】:

我通常在 python 中使用 paramiko ssh 模块运行我的自动化脚本时观察到这一点。在执行某些命令时,它失败并出现以下错误。在 tcl 脚本中也观察到了这个错误,所以意识到它不是特定于一种语言的

IOError: [Errno 32] Broken pipe

我们在将输出流写入文件时观察到它以及下面

file_handle.write(line_data)

我们可以处理异常并添加重试块(参考:IOError: [Errno 32] Broken pipe: Python

但我很想知道为什么会发生这种情况,这样我就可以在开始工作之前采取必要的预防措施。

我的发现导致“网络掉线”或“收件人系统没有响应”。但我并不真正相信这些观点。请告诉我根本原因

【问题讨论】:

    标签: python linux unix pipe rhel


    【解决方案1】:

    Broken pipe 仅仅意味着管道套接字的接收端已经关闭了连接。例如,考虑一下:

    % python3 -c 'print("hello\n" * 2' | python3 -c 'import os; os.write(1, os.read(0, 6))'
    hello
    

    没有错误发生,因为管道有一个缓冲区来保存多余的数据。

    现在的缓冲区在 Linux 中默认是 64Ki,所以

    % python3 -c 'print("h" * 65535)' | python3 -c 'import os; os.write(1, os.read(0, 5))'
    hhhhh
    

    但是

    % python3 -c 'print("h" * 65536)' | python3 -c 'import os; os.write(1, os.read(0, 5))'
    hhhhhhException ignored in: <_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>
    BrokenPipeError: [Errno 32] Broken pipe
    

    这里有 65536 个字符正在写入换行符;并且管道错误仅在 Python 程序结束时刷新流时发生。


    为避免该错误,任何读取输入的脚本必须始终消耗所有可用输入,直到文件结束,或者生成数据的脚本必须非常小心,以免产生超出预期的内容。

    【讨论】:

      猜你喜欢
      • 2012-12-21
      • 2017-04-22
      • 2014-04-28
      • 1970-01-01
      • 2013-04-16
      • 2021-10-11
      • 1970-01-01
      • 2011-09-11
      • 2016-04-30
      相关资源
      最近更新 更多