【发布时间】:2013-03-12 23:18:29
【问题描述】:
我有几个subprocess 实例,我想将它们串在一起形成一个管道,但我被困住了,想征求意见。
例如,模仿:
cat data | foo - | bar - > result
或者:
foo - < data | bar - > result
...我首先尝试了以下,它挂起:
import subprocess, sys
firstProcess = subprocess.Popen(['foo', '-'], stdin=subprocess.PIPE,
stdout=subprocess.PIPE)
secondProcess = subprocess.Popen(['bar', '-'], stdin=firstProcess.stdout,
stdout=sys.stdout)
for line in sys.stdin:
firstProcess.stdin.write(line)
firstProcess.stdin.flush()
firstProcess.stdin.close()
firstProcess.wait()
我的第二次尝试使用带有shell=True 参数的subprocess 实例,该实例有效:
import subprocess, sys
pipedProcess = subprocess.Popen(" ".join(['foo', '-', '|', 'bar', '-']),
stdin=subprocess.PIPE, shell=True)
for line in sys.stdin:
pipedProcess.stdin.write(line)
pipedProcess.stdin.flush()
pipedProcess.stdin.close()
pipedProcess.wait()
第一个链式subprocess 方法我做错了什么?我读到最好不要使用shell=True,我很好奇我在第一种方法中做错了什么。谢谢你的建议。
编辑
我修正了我的问题中的一个错字并修正了secondProcess 的stdin 参数。它仍然挂起。
我还尝试删除解决挂起的firstProcess.wait(),但随后我得到一个 0 字节文件为result。
我会坚持使用pipedProcess,因为它可以正常工作。但是,如果有人知道为什么第一个设置会挂起或生成一个 0 字节文件作为输出,我也很想知道原因。
【问题讨论】:
-
bar的标准输入不应该是foo的标准输出而不是它的标准输入吗? -
应该:我打错了。我已经在我的问题中解决了它。
-
如果您只是将您的标准输入复制到孩子的标准输入,那么
firstProcess = Popen(['foo', '-'], stdin=sys.stdin, stdout=PIPE)有效。
标签: python io subprocess io-redirection