Popen:将一个进程的stdout发送到两个进程的stdin

2024-09-25 04:32:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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无法获取信息。你知道吗


Tags: 代码frompy标题示例input进程stdin
1条回答
网友
1楼 · 发布于 2024-09-25 04:32:06

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

但是您可以读取进程的所有输出,并使用此输出作为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&;proc2Popen调用。第一个进程必须首先完全运行。你知道吗

另一种可能是不使用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的重复。答案可能太适合这个问题,太复杂了。把那个留在这里。你知道吗

相关问题 更多 >