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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以python子进程Popen接受多个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管道?有任何想法吗?谢谢!

答案

您不能合并两个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()来创建自己的管道。您的“源”子进程将其标准输出写入此管道的写入端,并且您的合并进程从另一端读取。完全支持这一点。

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

以上是关于可以python子进程Popen接受多个stdin流吗?的主要内容,如果未能解决你的问题,请参考以下文章

python子进程中的多个输入和输出通信

python子进程模块subprocess详解

Python子进程查杀

如何从 subprocess.Popen 使用 STDIN [重复]

在 Python 中分析子进程 Popen 调用

Python 3:子进程导致僵尸