How to use `subprocess` command with pipes

PythonLinuxSubprocessPipe

Python Problem Overview


I want to use subprocess.check_output() with ps -A | grep 'process_name'. I tried various solutions but so far nothing worked. Can someone guide me how to do it?

Python Solutions


Solution 1 - Python

To use a pipe with the subprocess module, you have to pass shell=True.

However, this isn't really advisable for various reasons, not least of which is security. Instead, create the ps and grep processes separately, and pipe the output from one into the other, like so:

ps = subprocess.Popen(('ps', '-A'), stdout=subprocess.PIPE)
output = subprocess.check_output(('grep', 'process_name'), stdin=ps.stdout)
ps.wait()

In your particular case, however, the simple solution is to call subprocess.check_output(('ps', '-A')) and then str.find on the output.

Solution 2 - Python

Or you can always use the communicate method on the subprocess objects.

cmd = "ps -A|grep 'process_name'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)

The communicate method returns a tuple of the standard output and the standard error.

Solution 3 - Python

See the documentation on setting up a pipeline using subprocess: http://docs.python.org/2/library/subprocess.html#replacing-shell-pipeline

I haven't tested the following code example but it should be roughly what you want:

query = "process_name"
ps_process = Popen(["ps", "-A"], stdout=PIPE)
grep_process = Popen(["grep", query], stdin=ps_process.stdout, stdout=PIPE)
ps_process.stdout.close()  # Allow ps_process to receive a SIGPIPE if grep_process exits.
output = grep_process.communicate()[0]

Solution 4 - Python

Using subprocess.run

import subprocess
    
ps = subprocess.run(['ps', '-A'], check=True, capture_output=True)
processNames = subprocess.run(['grep', 'process_name'],
                              input=ps.stdout, capture_output=True)
print(processNames.stdout)

Solution 5 - Python

You can try the pipe functionality in sh.py:

import sh
print sh.grep(sh.ps("-ax"), "process_name")

Solution 6 - Python

Also, try to use 'pgrep' command instead of 'ps -A | grep 'process_name'

Solution 7 - Python

JKALAVIS solution is good, however I would add an improvement to use shlex instead of SHELL=TRUE. below im grepping out Query times

#!/bin/python
import subprocess
import shlex

cmd = "dig @8.8.4.4 +notcp www.google.com|grep 'Query'"
ps = subprocess.Popen(cmd,shell=True,stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = ps.communicate()[0]
print(output)

Solution 8 - Python

command = "ps -A | grep 'process_name'"
output = subprocess.check_output(["bash", "-c", command])

Solution 9 - Python

After Python 3.5 you can also use:

    import subprocess
    
    f = open('test.txt', 'w')
    process = subprocess.run(['ls', '-la'], stdout=subprocess.PIPE, universal_newlines=True)
    f.write(process.stdout)
    f.close()

The execution of the command is blocking and the output will be in process.stdout.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionzuberuberView Question on Stackoverflow
Solution 1 - PythonTaymonView Answer on Stackoverflow
Solution 2 - PythonjkalivasView Answer on Stackoverflow
Solution 3 - PythonAlcubierreDriveView Answer on Stackoverflow
Solution 4 - Pythonanaken78View Answer on Stackoverflow
Solution 5 - PythonamoffatView Answer on Stackoverflow
Solution 6 - PythonShooeView Answer on Stackoverflow
Solution 7 - PythonDaniel SmithView Answer on Stackoverflow
Solution 8 - PythonBrentView Answer on Stackoverflow
Solution 9 - PythonzingiView Answer on Stackoverflow