Linux command-line call not returning what it should from os.system?
I need to make some command line calls to linux and get the return from this, however doing it as below is just returning
0 when it should return a time value, like
00:08:19, I am testing the exact same call in regular command line and it returns the time value
00:08:19 so I am confused as to what I am doing wrong as I thought this was how to do it in python.
import os retvalue = os.system("ps -p 2993 -o time --no-headers") print retvalue
What gets returned is the return value of executing this command. What you see in while executing it directly is the output of the command in stdout. That 0 is returned means, there was no error in execution.
Use popen etc for capturing the output .
Some thing along this line:
import subprocess as sub p = sub.Popen(['your command', 'arg1', 'arg2', ...],stdout=sub.PIPE,stderr=sub.PIPE) output, errors = p.communicate() print output
import os p = os.popen('command',"r") while 1: line = p.readline() if not line: break print line
ON SO : Popen and python
Read more... Read less...
The simplest way is like this:
import os retvalue = os.popen("ps -p 2993 -o time --no-headers").readlines() print retvalue
This will be returned as a list
Your code returns
0 if the execution of the commands passed is successful and non zero if it fails. The following program works on python2.7, haven checked 3 and versions above. Try this code.
>>> import commands >>> ret = commands.getoutput("ps -p 2993 -o time --no-headers") >>> print ret
Somewhat more convenient snippet to replace os.system that I use:
from subprocess import (PIPE, Popen) def invoke(command): ''' Invoke command as a new system process and return its output. ''' return Popen(command, stdout=PIPE, shell=True).stdout.read() result = invoke('echo Hi, bash!') # Result contains standard output (as you expected it in the first place).
I can not add a comment to IonicBurger because I do not have "50 reputation" so I will add a new entry. My apologies. os.popen() is the best for multiple/complicated commands (my opinion) and also for getting the return value in addition to getting stdout like the following more complicated multiple commands:
import os out = [ i.strip() for i in os.popen(r"ls *.py | grep -i '.*file' 2>/dev/null; echo $? ").readlines()] print " stdout: ", out[:-1] print "returnValue: ", out[-1]
This will list all python files that have the word 'file' anywhere in their name. The [...] is a list comprehension to remove (strip) the newline character from each entry. The echo $? is a shell command to show the return status of the last command executed which will be the grep command and the last item of the list in this example. the 2>/dev/null says to print the stderr of the grep command to /dev/null so it does not show up in the output. The 'r' before the 'ls' command is to use the raw string so the shell will not interpret metacharacters like '*' incorrectly. This works in python 2.7. Here is the sample output:
stdout: ['fileFilter.py', 'fileProcess.py', 'file_access..py', 'myfile.py'] returnValue: 0