基本上,正如标题所述,我需要将输出从一个进程发送到两个进程的输入。这是这个想法的简单代码示例:
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
无法获取信息。
答案 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)
除非您同时线程proc1
和proc2
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的重复。答案可能太过针对这个问题而复杂了。那个留在这里。