这是一个测试文件:
(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
有没有办法不分离命令并正确处理管道?
答案 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)