在`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"])
此代码不起作用!
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
但我想用'A'而不是123! – user1436187
@ user1436187,然后每次使用str.format传递变量如上 –
你是什么意思 “不工作” 吗?你是否收到错误信息,你会得到意想不到的结果吗? –