Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

like image 998
adelbertc Avatar asked May 01 '12 22:05

adelbertc


People also ask

How do you pass a pipe in subprocess Python?

To use a pipe with the subprocess module, you have to pass shell=True . In your particular case, however, the simple solution is to call subprocess. check_output(('ps', '-A')) and then str. find on the output.

How do I run a shell command in Python using subprocess?

Python Subprocess Run Function run() function was added in Python 3.5 and it is recommended to use the run() function to execute the shell commands in the python program. The args argument in the subprocess. run() function takes the shell command and returns an object of CompletedProcess in Python.

What is pipe in subprocess Python?

PIPE as either of them you specify that you want the resultant Popen object to have control of child proccess's stdin and/or stdout , through the Popen 's stdin and stdout attributes.

What is shell true in subprocess Python?

After reading the docs, I came to know that shell=True means executing the code through the shell. So that means in absence, the process is directly started.


1 Answers

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('\n'))[:3]
like image 79
phihag Avatar answered Oct 13 '22 22:10

phihag