Python进程管道与subprocess.Popen

时间:2016-05-20 12:54:16

标签: python-2.7 pipe subprocess

这是一个测试文件:

(0, 2*pi)

我正在以这种方式执行bash命令:

gunzip -c file_1.gz
Line 1
Line 2
Line 3

我需要在多个文件上并行运行此命令,然后加入进程。所以我似乎必须使用cmd = "gunzip -c file_1.gz | grep 3" subprocess.call(cmd, shell=True)) Line 3 。但是subprocess.Popen().communicate()无法正确识别管道并将其提供给第一个命令,在我的情况下是gunzip:

Popen

我想保留整个命令并避免以这种方式分开:

subprocess.Popen(cmd.split()).communicate())
gunzip: can't stat: | (|.gz): No such file or directory
gunzip: can't stat: grep (grep.gz): No such file or directory
gunzip: can't stat: 8 (8.gz): No such file or directory

有没有办法不分离命令并正确处理管道?

1 个答案:

答案 0 :(得分:1)

要运行grep 3命令,您需要上一个命令的输出,因此无法在使用subprocess.Popen的单个命令中成功运行此命令。

如果你总是想为所有文件运行grep 3,你可以加入所有gunzip -c file_x.gz的结果,然后在整个列表上只运行一次grep命令。

subprocess.Popen('gunzip -c file_1.gz'.split(), stdout=subprocess.PIPE)
subprocess.Popen('gunzip -c file_2.gz'.split(), stdout=subprocess.PIPE)
...
grep = subprocess.Popen('grep 3'.split(), stdin=all_gunzip_stdout, stdout=subprocess.PIPE)