¿La llamada de la línea de comandos de Linux no devuelve lo que debería de os.system?

Necesito hacer algunas llamadas de línea de comandos a linux y obtener el retorno de esto, sin embargo, hacerlo como se muestra a continuación es solo devolver 0 cuando debería devolver un valor de tiempo, como 00:08:19 , estoy probando la misma llamada en forma regular línea de comando y devuelve el valor de tiempo 00:08:19 así que estoy confundido en cuanto a lo que estoy haciendo mal, ya que pensé que esto era cómo hacerlo en Python.

 import os retvalue = os.system("ps -p 2993 -o time --no-headers") print retvalue 

Lo que se devuelve es el valor de retorno de la ejecución de este comando. Lo que se ve mientras se ejecuta directamente es la salida del comando en la salida estándar. Ese 0 es devuelto significa, no hubo error en la ejecución.

Utilice popen, etc. para capturar la salida.

Algo a lo largo de esta línea:

 import subprocess as sub p = sub.Popen(['your command', 'arg1', 'arg2', ...],stdout=sub.PIPE,stderr=sub.PIPE) output, errors = p.communicate() print output 

o

 import os p = os.popen('command',"r") while 1: line = p.readline() if not line: break print line 

EN TANTO: Popen y python

Si solo está interesado en la salida del proceso, es más fácil usar la función check_output del subproceso:

 output = subprocess.check_output(["command", "arg1", "arg2"]); 

Luego la salida mantiene la salida del progtwig a la salida estándar. Compruebe el enlace de arriba para más información.

La forma más simple es así:

 import os retvalue = os.popen("ps -p 2993 -o time --no-headers").readlines() print retvalue 

Esto será devuelto como una lista

Su código devuelve 0 si la ejecución de los comandos pasados ​​es exitosa y no cero si falla. El siguiente progtwig funciona en python2.7, he verificado 3 y las versiones anteriores. Prueba este código.

 >>> import commands >>> ret = commands.getoutput("ps -p 2993 -o time --no-headers") >>> print ret 

Sí, es contraintuitivo y no parece muy pythonic, pero en realidad simplemente imita el diseño de la API de Unix, donde estas funciones son funciones de C POSIX. Compruebe el sistema man 3 popen && man 3 system

Fragmento algo más conveniente para reemplazar os.system que utilizo:

 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). 

No puedo agregar un comentario a IonicBurger porque no tengo la “reputación de 50”, así que agregaré una nueva entrada. Mis disculpas. os.popen () es el mejor para comandos múltiples / complicados (mi opinión) y también para obtener el valor de retorno, además de obtener la salida estándar como los siguientes comandos múltiples más complicados:

 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] 

Esto mostrará una lista de todos los archivos de python que tienen la palabra ‘archivo’ en su nombre. La […] es una lista de comprensión para eliminar (eliminar) el carácter de nueva línea de cada entrada. El eco $? es un comando de shell para mostrar el estado de retorno del último comando ejecutado, que será el comando grep y el último elemento de la lista en este ejemplo. el 2> / dev / null dice que imprima el stderr del comando grep a / dev / null para que no se muestre en la salida. La ‘r’ antes del comando ‘ls’ es usar la cadena en bruto para que el shell no interprete los metacaracteres como ‘*’ incorrectamente. Esto funciona en python 2.7. Aquí está la salida de muestra:

  stdout: ['fileFilter.py', 'fileProcess.py', 'file_access..py', 'myfile.py'] returnValue: 0 

Este es un subproceso antiguo, pero os.system utilizando os.system , la siguiente es una forma válida de acceder a los datos devueltos por la llamada ps . Nota: utiliza un conducto para escribir los datos en un archivo en el disco. Y OP no solicitó específicamente una solución utilizando os.system .

 >>> os.system("ps > ~/Documents/ps.txt") 0 #system call is processed. >>> os.system("cat ~/Documents/ps.txt") PID TTY TIME CMD 9927 pts/0 00:00:00 bash 10063 pts/0 00:00:00 python 12654 pts/0 00:00:00 sh 12655 pts/0 00:00:00 ps 0 

en consecuencia,

 >>> os.system("ps -p 10063 -o time --no-headers > ~/Documents/ps.txt") 0 >>> os.system("cat ~/Documents/ps.txt") 00:00:00 0 

Sin embargo, no tengo idea de por qué todos están devolviendo ceros.

Para su requerimiento, la función Popen del módulo de subproceso python es la respuesta. Por ejemplo,

 import subprocess .. process = subprocess.Popen("ps -p 2993 -o time --no-headers", stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = process.communicate() print stdout 

Okey creo que la forma más rápida sería

 import os print(os.popen('command').readline()) x = _ print(x) 
 using commands module import commands """ Get high load process details """ result = commands.getoutput("ps aux | sort -nrk 3,3 | head -n 1") print result -- python 2x print (result) -- python 3x