可以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流吗?的主要内容,如果未能解决你的问题,请参考以下文章