Popen:将标准输出从一个进程发送到两个进程的标准输入

时间:2019-01-17 19:48:49

标签: python popen

基本上,正如标题所述,我需要将输出从一个进程发送到两个进程的输入。这是这个想法的简单代码示例:

from subprocess import Popen, PIPE

input = Popen(['python', 'input.py'], stdout = PIPE)

proc1 = Popen(['python', 'print.py'], stdin = input.stdout)
proc2 = Popen(['python', 'print.py'], stdin = input.stdout)

proc1.communicate()
proc2.communicate()

此代码运行时,proc1吞噬了输入,因此从输入过程开始,所以proc2无法获取信息。

1 个答案:

答案 0 :(得分:0)

您不能这样做。您只能将输出通过管道传输到一个进程,因为管道会消耗数据。

但是,您可以读取进程的所有输出,并以该输出作为communicate的参数来运行其他进程。

from subprocess import Popen, PIPE

input = Popen(['python', 'input.py'], stdout = PIPE)
contents = input.stdout.read()

proc1 = Popen(['python', 'print.py'], stdin = PIPE)
proc2 = Popen(['python', 'print.py'], stdin = PIPE)

proc1.communicate(contents)
proc2.communicate(contents)

除非您同时线程proc1proc2 Popen调用,否则显然不会并行运行。而且第一个过程必须首先完全运行。

另一种可能性是在不使用communicate的情况下将输入提供给两个进程:

from subprocess import Popen, PIPE

proc_in = Popen(['python', 'input.py'], stdout = PIPE)
proc1 = Popen(['python', 'print.py'], stdin = PIPE)
proc2 = Popen(['python', 'print.py'], stdin = PIPE)
for line in proc_in.stdout:
  proc1.stdint.write(line)
  proc2.stdint.write(line)

proc1.wait()
proc2.wait()

在这种情况下,所有内容并行运行。每次从第一个过程产生输出时,都会将其实时馈送到两个过程中。

现在意识到问题是Python: Redirect stdout of a subprocess to stdin of 2 or more subprocesses的重复。答案可能太过针对这个问题而复杂了。那个留在这里。