通过Python子进程modu在shell中进行管道连接

2024-04-30 04:18:56 发布

您现在位置:Python中文网/ 问答频道 /正文

所以我试图查询给定机器上的前3个CPU“密集型”进程,我找到了这个shell命令来完成这个任务:ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3

我想在Python脚本中使用这些数据,因此需要能够通过subprocess模块捕获上述命令的输出。下面的操作有效,但返回一个很大的字符串,因为我没有将它限制在前3个:

psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args'])

我不太清楚这个subprocess.check_output是怎么工作的。。在一次微不足道的尝试中,我试着:

subprocess.check_output(['ps', '-eo', 'pcpu,user,args', '|', 'sort', '-k', '1', '-r', '|', 'head', '-3'])

这给了我一个错误:ps: illegal argument: |

如何在Python中使用管道|符号,或者使用其他方法进行排序,而不必对psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args'])返回的巨大字符串进行大量的解析?

谢谢! 当做, -克斯特鲁克


Tags: 字符串命令机器outputcheckargscpueo
3条回答

如果您使用:

subprocess.check_output("ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3", shell=True)

然后使用/bin/sh运行命令,这样管道就可以工作了。

还有一些人建议使用shell=True,如果要将可信输入传递给shell,那么this answer就可以了。然而,shell=True引入了一些不安全性。为了安全起见,docs建议如下:

output=`dmesg | grep hda`
# becomes
p1 = Popen(["dmesg"], stdout=PIPE)
p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE)
p1.stdout.close()  # Allow p1 to receive a SIGPIPE if p2 exits.
output = p2.communicate()[0]

可以传递shell=True参数来执行纯shell命令:

import subprocess
subprocess.check_output('ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3',
                        shell=True)

或者,使用ps和Python内置字符串函数的排序选项,如下所示:

raw = subprocess.check_output('ps -eo pcpu,pid,user,args --sort -pcpu')
first_three_lines = list(raw.split('\n'))[:3]

相关问题 更多 >