Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
555 views
in Technique[技术] by (71.8m points)

piping in shell via Python subprocess module

So I'm trying to query for the top 3 CPU "intensive" processes on a given machine, and I found this shell command to do it: ps -eo pcpu,pid,user,args | sort -k 1 -r | head -3

I want to use this data inside a Python script, so I need to be able to capture the output of the above command via the subprocess module. The following works, but just returns a huge string since I'm not restricting it to the top 3:

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

I'm not quite sure how this subprocess.check_output works.. in a meager attempt I tried:

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

Which gives me an error: ps: illegal argument: |

How do I use the pipe | symbol inside Python, or use some other way to do the sorting without having to do incredible amounts of parsing on the huge string returned by psResult = subprocess.check_output(['ps', '-eo', 'pcpu,user,args'])?

Thanks! Regards, -kstruct

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You can pass the shell=True argument to execute the plain shell command:

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

Alternatively, use the sorting options of ps and Python's built-in string functions like this:

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

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...