在Python中使用参数执行bash命令

时间:2016-05-30 09:09:48

标签: python bash subprocess

这是一个bash命令,我在python中运行并获得预期的结果:

count = subprocess.Popen("ps -ef | grep app | wc -l", stdout=subprocess.PIPE, shell=True)

但是当我想传递一个参数(在这种情况下计数)时,无法弄清楚如何去做。 我试过了:

pid = subprocess.call("ps -ef | grep app | awk -v n=' + str(count), 'NR==n | awk \'{print $2}\'", shell=True)

args = shlex.split('ps -ef | grep app | awk -v n=' + str(count), 'NR==n | awk \'{print $2}\'')
pid = subprocess.Popen(args, stdout=subprocess.PIPE, shell=True)

其他尝试中,来自各个帖子,但仍然无法做到。

3 个答案:

答案 0 :(得分:2)

你正在混合开始和结束语录,你在其他事情中错误地传了冒号。

试试这个来修复:

pid = subprocess.call("ps -ef | grep app | awk -v n=" + str(count) + " NR==n | awk '{print $2}'", shell=True)

您使用"打开了命令参数,然后在+ str() "而不是'之前需要关闭它。更进一步,我将, 'NR=+ "NR=交换,因为您希望在命令中附加更多内容,而不是将参数传递给subprocess.call()

正如评论中所指出的,将命令与shlex分开是没有意义的,因为管道命令未在subprocess中实现,但我想指出使用shell=True通常不建议使用{例如examples given here

之一

答案 1 :(得分:0)

另一个vay正在使用格式:

pid = subprocess.call("ps -ef | grep app | awk -v n={} NR==n | awk '{{print $2}}'".format(str(count)), shell=True)

答案 2 :(得分:0)

您的Awk管道可以简化很多 - 如果目标是打印最后一场比赛,ps -ef | awk '/app/ { p=$2 } END { print p }'会这样做。但很多时候,从Python运行Awk是愚蠢的,在Python中执行过滤既方便又简单,而且显然更有效(不仅保存了Awk进程,还保存了令人讨厌的shell=True)。 / p>

for p in subprocess.check_output(['ps', '-ef']).split('\n'):
    if 'app' in p:
        pid = p.split()[1]