在`subprocess.call`中使用多个命令#

问题描述:

我想使用call创建一个shell管道。例如,我要运行这段代码获得具有123的行数:在`subprocess.call`中使用多个命令#

shell命令是:

grep "123" myfile | wc -l > sum.txt 

但是,“123”是一个变量,所以我想使用Python:

A= ["123","1234","12345"] 
for i in A: 
    call(["grep", i,"| wc >> sum.txt"]) 

此代码不起作用!

+1

你是什么意思 “不工作” 吗?你是否收到错误信息,你会得到意想不到的结果吗? –

call只调用一个可执行文件。您需要的是将该可执行文件作为解析命令行的shell(例如bash)。 bash也负责处理管道。您可以使用shell=True选项执行此操作,该选项默认为关闭。

当你给它一个数组像你这样做,那么你在呼唤该可执行文件这些参数。管道不是争论;而grep不知道如何管道,也不知道如何调用wc

你可以做

call(["grep '%s' myfile | wc >> sum.txt" % i, shell=True) 

如果您使用的是管道符,你需要shell=True,使用str.format通过每次i

call('grep "{}" myfile | wc >> sum.txt'.format(i),shell=True) 

你也可以不用shell=True和使用python来打开文件,而不是外壳重定向:

from subprocess import Popen, PIPE, check_call 

p = Popen(["grep","myfile" i], stdout=PIPE) 
with open('sum.txt', "a") as f: 
    check_call(["wc"], stdin=p.stdout,stdout=f) 

而且你>>>不一样的,所以什么模式,你在打开文件将取决于哪一个你真正想要REPL icate

+0

但我想用'A'而不是123! – user1436187

+0

@ user1436187,然后每次使用str.format传递变量如上 –