更换壳牌管道[重复]

2024-05-15

在 subprocess 模块的 Python 2.7 文档中,我找到了以下片段:

p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

来源 :https://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline https://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline

我不明白这一行:p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits.

这里 p1.stdout 被关闭。如果 p2 退出,它如何允许 p1 接收 SIGPIPE?


如果进程尝试写入没有活动进程正在查找的管道,则通常会发送 SIGPIPE 信号。在相当于代码片段的 shell 管道中:

`dmesg | grep hda`

If the grep进程由于某种原因终止之前dmesg完成写入输出,dmesg将收到 SIGPIPE 并终止自身。这将是 UNIX/Linux 进程的预期行为(http://en.wikipedia.org/wiki/Unix_signal http://en.wikipedia.org/wiki/Unix_signal).

相比之下,在 Python 实现中使用subprocess, if p2之前退出p1生成输出完成后,SIGPIPE 不会被发送,因为实际上仍然有一个进程在查看管道 - Python 脚本本身(创建的脚本)p1 and p2)。更重要的是,脚本正在查看管道,但不消耗其内容 - 效果是管道无限期地保持打开状态,并且p1陷入困境。

明确关闭p1.stdout将 Python 脚本从管道中分离出来,并使得除了p2正在看着管道 - 这样如果p2之前结束p1, p1正确地让信号自行结束,而无需任何人为地保持管道打开。

这是一个替代措辞的解释:http://www.enricozini.org/2009/debian/python-pipes/ http://www.enricozini.org/2009/debian/python-pipes/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

更换壳牌管道[重复] 的相关文章

随机推荐

  • 线性同余生成器 - 如何选择种子和统计检验

    我需要做一个线性同余生成器 它将成功通过所选的统计测试 我的问题是 如何正确选择发电机的数字以及 我应该选择哪些统计检验 我想 均匀性的卡方频率测试 每代收集10 000个号码的方法 将 0 1 细分为10个相等的细分 柯尔莫哥洛夫 斯米尔
  • Coldfusion CreateDate 问题

    我遇到了一些麻烦CreateDate 函数 它只是出错 我不知道为什么 我正在运行此查询以获取新闻报道中的所有日期 以便我可以每月创建一个新闻档案
  • 如何在c的case语句中使用省略号?

    CASE expr no commas ELLIPSIS expr no commas 我在c的语法规则中看到了这样的规则 但是当我尝试重现它时 int test float i switch i case 1 3 printf hi 它失
  • ASP.NET MailMessage.BodyEncoding 和 MailMessage.SubjectEncoding 默认值

    很简单的问题 但我在 MSDN 上找不到答案 查找 ASP NET 将用于的默认值 MailMessage BodyEncoding and MailMessage SubjectEncoding 如果你不在代码中设置它们 Thanks F
  • iOS 使用 NSColor 与 UIColor?

    有什么区别UIColor and NSColor 什么时候会使用每一种 我碰到NSColor在试图弄清楚的同时UIColor用于 iOS 中的属性字符串 我理解使用UIColor对于 UIKit 等 但我不认为NSColor对于这种事情确实
  • 清理 html 字符串中的所有脚本

    HTML5 剪贴板很棒 但我正在寻找一种使其安全的方法 用户正在将文本 html 粘贴到我的网页中 这允许他们粘贴图像 表格等 我正在寻找一种方法 在将粘贴的内容添加到页面之前删除所有脚本 我需要删除
  • 计算 pyspark df 列中子字符串列表的出现次数

    我想计算子字符串列表的出现次数 并根据 pyspark df 中包含长字符串的列创建一个列 Input ID History 1 USA UK IND DEN MAL SWE AUS 2 USA UK PAK NOR 3 NOR NZE 4
  • 根据列索引重命名 Dataframe 列

    是否有内置函数可以按索引重命名 pandas 数据框 我以为我知道列标题的名称 但事实证明第二列中有一些十六进制字符 根据我接收数据的方式 我将来可能会在第 2 列中遇到这个问题 因此我无法将这些特定的十六进制字符硬编码到 datafram
  • 使用并集查找(又名不相交集)检测图是否是二分图

    我正在 Spoj 上做一个问题 基本上可以简化为检测图是否是二分图 我正在尝试使用 dfs 为图表着色 但它太慢了 有人评论这个 没有 bfs 没有 dfs 没有二部图 简单的并查集就可以做到 确实速度很快 提示 1 偶数长度的环不会影响两
  • Django Rest Framework POST 更新(如果存在或创建)

    我是 DRF 的新手 我阅读了 API 文档 也许这是显而易见的 但我找不到一个方便的方法来做到这一点 我有一个Answer与 a 具有一对一关系的对象Question 在前端 我曾经使用 POST 方法来创建发送到的答案api answe
  • Docker和--userns-remap,如何管理卷权限以在主机和容器之间共享数据?

    在 Docker 中 在容器内创建的文件在从主机检查它们时往往具有不可预测的所有权 默认情况下 卷上文件的所有者是 root uid 0 但一旦非 root 用户帐户参与容器并写入文件系统 从主机的角度来看 所有者或多或少会变得随机 当您需
  • 手动设置Android Studio的JDK路径

    如何为 Android Studio 使用自定义 JDK 路径 我不想弄乱 PATH 因为我没有管理员权限 是否有某个配置设置文件允许我进行设置 如果您查看项目设置 您可以从那里访问 jdk 在标准 Windows 键盘映射上 您可以在项目
  • Swift 中的 viewWillLayoutSubviews

    我正在尝试翻译SKScene scene GameScene sceneWithSize skView bounds size 进入 swift 但我收到错误 sceneWithSize 不可用 使用对象构造 SKScene size 我在
  • 删除 HoloViews 中的 Bokeh 徽标

    是否可以从 HoloViews 生成的图中删除 Bokeh 徽标 没有什么反对的 只是在某些报告中显示它可能没有意义 我知道在 Bokeh 中我可以简单地执行以下操作 p bkp figure p toolbar logo None UPD
  • Android S8+ 警告消息“不支持当前的显示尺寸设置,可能会出现意外行为”

    我在 Samsung S8 Android 7 中收到此警告消息 APP NAME 不支持当前的显示尺寸设置 可能会 行为出乎意料 它意味着什么以及如何删除它 谢谢 通过添加解决supports screens 机器人 xlargeScre
  • 在python中读取PASCAL VOC注释

    我在 xml 文件中有注释 例如这个 它遵循 PASCAL VOC 约定
  • 从关系中合并 Laravel 中的集合

    假设我有 3 张桌子 Images Subject Style 关系是多对多 图像 主题 和多对多 图像 样式 现在我想做一些类似的事情 result subjectResult gt images gt merge styleResult
  • C# 中的 strstr() 等效项

    我有两个byte 我想找到第二个的第一次出现byte 在第一个byte 或其中的一个范围 我不想使用字符串来提高效率 翻译第一个byte to a string会效率低下 基本上我相信就是这样strstr 在 C 中做 最好的方法是什么 这
  • 如何在 Go 中将环境变量传递给测试用例

    在为 Go 编写测试用例时 传递需要提供给测试的环境变量的标准方法是什么 例如 我们不想在测试用例的源代码中嵌入密码 处理这个问题最标准的方法是什么 我们让测试用例寻找配置文件吗 还有别的事吗 看来我偶然发现了答案 将其添加到测试用例中可以
  • 更换壳牌管道[重复]

    这个问题在这里已经有答案了 在 subprocess 模块的 Python 2 7 文档中 我找到了以下片段 p1 Popen dmesg stdout PIPE p2 Popen grep hda stdin p1 stdout stdo