【问题标题】:chaining Popen subprocesses properly正确链接 Popen 子进程
【发布时间】:2011-10-02 13:57:07
【问题描述】:

我有如下构造:

os.mkfifo('pipe.tmp')
enc = Popen(['encoder', '-i', 'pipe.tmp'])
cap = Popen(['capture', '-f', 'pipe.tmp'])

这里cap 是一个通常写入文件的进程(由-f 指定),但我可以通过提供/dev/stdout 作为输出文件来将数据发送到屏幕。同样,enc 期望从类似文件的对象中读取,我可以通过提供 - 作为输入来让它从管道中读取。所以不是在操作系统中使用命名管道,我认为可能不需要特殊文件,我可以使用这样的未命名管道..

cap = Popen(['capture', '-f', '/dev/stdout'], stdout=PIPE)
enc = Popen(['encoder', '-i', '-'], stdin=cap.stdout)
cap.stdout.close()

(还要注意产卵顺序的颠倒)。我更喜欢这个,因为临时文件似乎没有必要,但我有点担心这个结构是否会以我期望的方式链接进程。

  1. cap 正在与之交谈的/dev/stdout 与操作系统中的实际标准输出不同吗?也就是说,使用enc 中的输入管道-,即使其他进程正在与操作系统上的/dev/stdout 聊天,我是否会在这两个进程之间获得干净的数据通道?
  2. 阻塞/排队的行为会有什么显着差异吗?我认为在我的第一个示例中,命名管道将是一个缓冲的 4096 字节,如果cap/enc 的写入/读取速度不够快,则会在任一端阻塞,但如果我错了,请纠正我。
  3. 是否需要任何特殊的生成或终止顺序,或者我应该注意的任何其他问题?

【问题讨论】:

    标签: python subprocess pipe named-pipes popen


    【解决方案1】:
    1. /dev/stdout 为您提供当前进程的标准输出,因此您应该可以使用它。 (关于 /dev/stdout 并没有真正的“全局”)
    2. 第一个示例中的 fifo 大小取决于系统的配置(我不确定如何更改)。但是 subprocess.Popen 允许您为其 I/O 操作定义缓冲区大小,因此您应该能够对其进行调整。 更新: 再进行一些研究,我发现管道有 64kB 的限制,不受 bufsize 参数的影响。不知道如何解决这个问题(除了更频繁地阅读和手动处理缓冲)
    3. 对于您的第二个示例,您似乎需要按照您给定的顺序启动,因为您需要 cap.stdout 在启动 enc 之前可用。或者,您可以使两个进程断开连接并手动处理它们之间的通信。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-05
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 2014-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多