2010-09-24 39 views
50

Necesito hacer algunas llamadas de línea de comando a Linux y obtener el retorno de esto, sin embargo hacerlo como se indica a continuación devuelve 0 cuando debería devolver un valor de tiempo, como 00:08:19, estoy probando exactamente la misma llamada en la línea de comando normal y devuelve el valor de tiempo 00:08:19 por lo que estoy confundido en cuanto a lo que estoy haciendo mal, ya que pensé que era cómo hacerlo en Python. Cualquier consejo es apreciado.Python, os.system for command-line call (linux) no devuelve lo que debería?

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

Aunque no hablo del pitón, que va a querer 'popen'. Porque la salida de prueba de un comando es * no * lo mismo que su valor de retorno ... – dmckee

+0

¿qué versión de Python? –

+0

su python 2.6.5 – Rick

Respuesta

90

Lo que se devuelve es el valor de retorno de la ejecución de este comando. Lo que se ve al ejecutarlo directamente es la salida del comando en stdout. Que 0 sea devuelto significa que no hubo error en la ejecución.

Utilice popen etc. para capturar la salida.

Algunos 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 SO: Popen and python

20

Si sólo estás interesado en el resultado del proceso, que es más fácil de usar subproceso 'check_output función:


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

Luego, la salida mantiene la salida del programa en stdout. Consulte el enlace de arriba para más información.

+4

==== python 2.7 + – macm

+0

también se recomienda, si no necesita la salida, subprocess.check_call(), que comprueba el estado del proceso y genera un error en caso de error. (2.4+) Pero esa no es una respuesta a * esta * pregunta, que específicamente necesita capturar la salida. Todavía uno de mis favoritos. :) – tekHedd

0

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

import os 
print(os.popen('command').readline()) 
x = _ 
print(x) 
+0

print (os.popen ('comando'). Read()) si desea devolver todos los resultados. readline solo va a devolver la primera línea. También vale la pena señalar que esta es la sintaxis de Python3. – aychedee

+1

'_' solo se establece en el shell interactivo de python; esto no funcionará en un script. –

7

Su código devuelve 0 si la ejecución de los comandos pasaron tiene éxito y no cero si se produce un error. El siguiente programa funciona en python2.7, ha revisado 3 y versiones anteriores. Prueba este código

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

commands.getoutput ('ls') arroja un error de "Uso: comandos [bnum]" para mí. – Spanky

+3

Este módulo se eliminó en Python 3, lo cual es una lástima porque es más conveniente que suprocess module. – Trismegistos

2

sí, es contrario a la intuición y no parece muy Pythonic, pero en realidad sólo imita el diseño de la API de UNIX, donde éstos se tituló son funciones C POSIX. Compruebe 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). 
4

La forma más sencilla es la siguiente:

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

Este será devuelto como una lista

1

Este es un antiguo, pero usando puramente os.system, la siguiente es una forma válida de acceder a los datos devueltos por la llamada ps. Nota: usa una tubería para escribir los datos en un archivo en el disco. Y OP no pidió específicamente una solución usando 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 

consecuencia,

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

idea de por qué todos vuelven ceros sin embargo.

+0

los ceros que regresan son los códigos de salida, lo que significa que los comandos se ejecutaron con éxito – mazs

1

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 
2

no puedo dejar un comentario a IonicBurger porque no tengo "50 reputación", por lo voy a añadir una nueva entrada. Mis disculpas. os.popen() es la mejor para varios comandos/complicados (mi opinión) y también para conseguir el valor de retorno, además de recibir la salida estándar como los siguientes más complicados varios comandos:

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 muestra todos archivos de pitón que tienen la palabra 'archivo' en cualquier parte de su nombre. El [...] es una lista de comprensión para eliminar (quitar) el carácter de nueva línea de cada entrada. ¿El echo $? 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. la 2>/dev/null dice para imprimir el stderr del grep comando para /dev/null por lo que no se presenta en la salida. El 'r' antes del 'ls' es utilizar la cadena sin formato para que el shell no interprete los metacaracteres como '*' incorrectamente. Esto funciona en python 2.7. Aquí está el resultado de ejemplo:

 stdout: ['fileFilter.py', 'fileProcess.py', 'file_access..py', 'myfile.py'] 
returnValue: 0 
-1
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 
Cuestiones relacionadas