How do I run a command with a pipe |
in it?
The subprocess module seems complex...
Is there something like
output,error = `ps cax | grep something`
as in shell script?
To search a file employing grep in Python, import the “re” package, upload the file, and use a for loop to iterate over each line. On each iteration, use the re.search() method and the RegEx expression as the primary argument and the data line as the second.
See Replacing shell pipeline:
import subprocess proc1 = subprocess.Popen(['ps', 'cax'], stdout=subprocess.PIPE) proc2 = subprocess.Popen(['grep', 'python'], stdin=proc1.stdout, stdout=subprocess.PIPE, stderr=subprocess.PIPE) proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits. out, err = proc2.communicate() print('out: {0}'.format(out)) print('err: {0}'.format(err))
PS. Using shell=True
can be dangerous. See for example the warning in the docs.
There is also the sh module which can make subprocess scripting in Python a lot more pleasant:
import sh print(sh.grep(sh.ps("cax"), 'something'))
You've already accepted an answer, but:
Do you really need to use grep? I'd write something like:
import subprocess ps = subprocess.Popen(('ps', 'cax'), stdout=subprocess.PIPE) output = ps.communicate()[0] for line in output.split('\n'): if 'something' in line: ...
This has the advantages of not involving shell=True
and its riskiness, doesn't fork off a separate grep process, and looks an awful lot like the kind of Python you'd write to process data file-like objects.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With