“是”报告子进程通信错误()

2023-12-04

我正在使用以下函数在 Python 中运行命令:

def run_proc(cmd):
    child = subprocess.Popen(cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    stdout, stderr = child.communicate()
    returncode = child.returncode
    return stdout, stderr, returncode

它一直工作得很好,但现在我正在尝试使用yes将输出通过管道传输到标准输入的程序。我尝试运行的命令如下:

yes '' | apt-get -y -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confold" dist-upgrade

但我相信它可以用一个一般的例子来代替,比如:

yes | head -3 | cat

我的问题是,如果我尝试运行任何命令yes |其中,上面的 subprocess.Popen 将包含错误消息:

yes: standard output: Broken pipe
yes: write error

对我来说,管道似乎仍然有效,从yes | head -3 | cat的回答:y y y.

我有以下问题:

  1. 即使 yes 报告错误, yes 管道是否仍然有效?
  2. 我该如何修复它?

问题是subprocess module 在 Python 3.2+ 未恢复之前SIGPIPE信号处理程序默认操作。这就是为什么你得到EPIPE而是写入错误。

在 Python 3.2+ 中

>>> from subprocess import check_output
>>> check_output("yes | head -3", shell=True)
b'y\ny\ny\n'

yes被杀死SIGPIPE when head exits.

在Python 2中:

>>> from subprocess import check_output
>>> check_output("yes | head -3", shell=True)
yes: standard output: Broken pipe
yes: write error
'y\ny\ny\n'

yes got EPIPE写入错误。忽略该错误是安全的。它传达的信息与SIGPIPE.

要解决该问题,您可以模拟restore_signals在Python 2中使用preexec_fn范围 :

>>> from subprocess import check_output
>>> import signal
>>> def restore_signals(): # from http://hg.python.org/cpython/rev/768722b2ae0a/
...     signals = ('SIGPIPE', 'SIGXFZ', 'SIGXFSZ')
...     for sig in signals:
...         if hasattr(signal, sig):
...            signal.signal(getattr(signal, sig), signal.SIG_DFL)
... 
>>> check_output("yes | head -3", shell=True, preexec_fn=restore_signals)
'y\ny\ny\n'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“是”报告子进程通信错误() 的相关文章

随机推荐

  • 了解 libx264 输出 [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我在 ffmpeg 中使用 libx264 进行编码 最后我得到了以下输出 谁能指导我理解和解释这一点 有任何参考 文档吗 01 01 06 34 43 650 I stderr 6
  • 迭代包含嵌套数组的 pandas 数据框列

    我希望你能帮我解决这个问题 我在下面有这些数据 列名称随便 data file0090 84 55 189 248 100 18 68 115 88 file6565 86 58 189 24 10 118 68 11 8 我需要将第 0
  • Celery 单元测试重试

    我目前正在为我的 celery 任务编写单元测试 并想测试我的任务是否正在重试 注意 ALWAYS EAGER 在测试设置中设置为 True app shared task bind True soft time limit 600 aut
  • Arduino 频率为 11.0592MHz。修改Timer0、delayMicroseconds()

    我在 Arduino 环境中使用 11 0592MHz 的 ATMega328P 我发现delayMicroseconds 函数快了大约27 原因是 wiring c 中的代码假设时钟速度现在为 8MHz 现在我尝试修复它 我发现了不同的帖
  • 如何安装本地 gem?

    如果我将 gem 文件下载到计算机中的某个文件夹中 我可以稍后使用它进行安装吗gem install 另外 您可以使用gem install local path to gem filename gem 这将跳过您离开时发生的通常的 gem
  • 从 VBA 调用 Python 脚本

    我在 Excel 中从 vba 调用 python 脚本时遇到问题 我阅读了解决相同问题的其他线程 但是当我运行代码时 Python 屏幕闪烁 然后消失 仅供参考 我下载了适用于 Windows 10 的 python 3 6 5 并将其添
  • 使用 JavaScript 中的 Dart 类

    我有一个 Dart 类 foo dart class Foo void talk print Hello 将 foo dart 编译为 JavaScript 后 我 希望能够像这样使用 Foo var foo new Foo from fo
  • java.lang.NoClassDefFoundError:org/apache/commons/lang/Validate

    为什么会发生以下情况以及如何解决 Exception in thread main java lang NoClassDefFoundError org apache commons lang Validate at org jsoup D
  • Pygame 如何修复“尾随像素”?

    在图像中 红色轨迹是当我在精灵周围添加边界矩形时 pygame 创建的轨迹 精灵也可以做到这一点 最简单的解决方案是在每次重绘后将表面清除为黑色 然而 尝试在整个主表面上这样做并不是一个好主意 我怎样才能解决这个问题 通常你会这样做 def
  • Java 中 for 循环转换为 while 循环

    我需要将这个 for 循环转换为 while 循环 这样我就可以避免使用中断 double array new double 100 Scanner scan new Scanner System in for int index 0 in
  • 单击 Facebook 通知后应用程序启动时,请求 ID 不可用

    Facebook 应用程序是使用 iOS 本机应用程序设置的 并使用另一个应用程序的捆绑 ID 和应用商店 ID 启用 在当前情况下 以下是可能的 1 向朋友发送应用程序请求 2 请求徽章出现在好友的Facebook中 3 单击请求将启动我
  • ftplib.error_perm: 553 无法创建文件。 (Python 2.4.4)

    我正在写入我要通过 FTP 访问的用户的主目录 因此权限应该不是问题 FTP 在 FileZilla 中运行 我检查了 vsftp conf 并做了local enable YES change On a Debian4使用 Python
  • 在 Angular2 中设置选定的属性

    我有选择组 我想为具有特定 id 的对象设置选定属性 我试图在功能上改变这种情况 但没有帮助 即使我只是简单地设置 attr selected true 这也没有帮助 div class form group div
  • 检查给定区域中是否存在包含 4 个顶点的点

    指的是http www weather gov directives sym pd01008006curr pdf 第 8 页 我们在地理坐标系 纬度和经度系统 中给出了一个具有四个顶点的区域 我想检查该区域内是否存在具有特定纬度和经度的点
  • Application Insights 如何跟踪 User_Id?

    我正在运行具有应用程序洞察力的 Azure Web 应用程序 我知道微软无法显示真实IP Client IP 所以我将真实IP地址添加到所有请求 Ip 我有一个访客 client id h9zbt 在过去 24 小时内使用 48 个不同的
  • 更新后“主页”类别页面无法使用

    版本 1 4 1 4 的 prestashop 网站正在与category php类别页面的文件 不幸的是 1 6 0 6 的更新删除了该文件 因为它已被视为已弃用 CMS 更新后 URL 结构发生变化 后果之一是 URL 结构发生变化 f
  • Rails-4 中不区分大小写的活动记录查询

    目前我正在 Rails 4 中的一个项目中工作 其中我在 example com username 上有一个用户页面 但如果我在正确的情况下使用用户名 它只会找到记录 如何在活动记录 Rails 中执行不区分大小写的搜索 看看我下面的代码
  • 当使用 Python 处理一个巨大的 CSV 并突然停止时,“killed”是什么意思?

    我有一个 Python 脚本 它导入一个大型 CSV 文件 然后计算文件中每个单词的出现次数 然后将计数导出到另一个 CSV 文件 但正在发生的事情是 一旦计数部分完成并开始导出 它就会说Killed在终端中 我不认为这是一个内存问题 如果
  • 如何从 Google Earth Engine python api 迭代并下载图像集合中的每个图像

    我是 Google Earth Engine 的新手 试图了解如何使用 Google Earth Engine python api 我可以创建一个图像集 但显然getdownloadurl 方法仅适用于单个图像 所以我试图了解如何迭代并下
  • “是”报告子进程通信错误()

    我正在使用以下函数在 Python 中运行命令 def run proc cmd child subprocess Popen cmd shell True stdout subprocess PIPE stderr subprocess