【发布时间】: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()
(还要注意产卵顺序的颠倒)。我更喜欢这个,因为临时文件似乎没有必要,但我有点担心这个结构是否会以我期望的方式链接进程。
- 是
cap正在与之交谈的/dev/stdout与操作系统中的实际标准输出不同吗?也就是说,使用enc中的输入管道-,即使其他进程正在与操作系统上的/dev/stdout 聊天,我是否会在这两个进程之间获得干净的数据通道? - 阻塞/排队的行为会有什么显着差异吗?我认为在我的第一个示例中,命名管道将是一个缓冲的 4096 字节,如果
cap/enc的写入/读取速度不够快,则会在任一端阻塞,但如果我错了,请纠正我。 - 是否需要任何特殊的生成或终止顺序,或者我应该注意的任何其他问题?
【问题讨论】:
标签: python subprocess pipe named-pipes popen