可以python子进程Popen接受多个stdin流吗?

时间:2018-03-06 13:48:59

标签: python subprocess stdin

我有两个文件需要解析并合并到一个文件中。文件非常大,所以我使用管道,所以我没有任何中间文件。我正在使用的代码是......

import subprocess

proc1 = subprocess.Popen([
    'parse_script', '-c', '0.5', '-i' path_to_file1
], stdout=subprocess.PIPE)

proc2 = subprocess.Popen([
    'parse_script', '-c', '0.5', '-i' path_to_file2
], stdout=subprocess.PIPE)

merge_proc = subprocess.Popen([
    'merge_outputs', '-o', path_to_output_file,
], stdin=(proc1.stdout, proc2.stdout)) # yes, I know this is an error, it's here for demonstrative purposes

merge_proc.communicate()

所以我有两个解析这两个文件的进程,但是我需要获取这两个进程的stdout并将它们都传递给合并进程的stdin。上面的代码演示了我正在尝试做的事情。所以我的问题是;如何在文件合并过程中接受多个stdin管道?有任何想法吗?谢谢!

1 个答案:

答案 0 :(得分:1)

您无法合并两个subprocess.PIPE,但您可以使用自己的管道作为变通方法。像这样:

import subprocess
import os

read_end, write_end = os.pipe()

proc1 = subprocess.Popen(['ls', '/tmp'], stdout=write_end)

proc2 = subprocess.Popen(['ls', '/etc'], stdout=write_end)
os.close(write_end)
merge_proc = subprocess.Popen([
    '/tmp/merge_outputs'], stdin=read_end)

merge_proc.wait()

这使用os.pipe()来创建自己的管道。你的来源"子进程将其标准输出写入此管道的写入端,并且您的合并进程从另一端读取。完全支持这一点。

源代码处理完成后,应关闭管道的写入端。这将允许合并过程在收到所有数据后完成处理。