这是一个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)
其他尝试中,来自各个帖子,但仍然无法做到。
答案 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]