2011-12-28 17 views
14

Necesito almacenar el resultado de un comando de shell que ejecuté en una variable. Pero no pude conseguir eso. Intenté como:¿Cómo almacenar el resultado de un comando de shell ejecutado en una variable en python?

call=os.system("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'") 
print call 

Pero imprime el resultado en el terminal e imprime el valor de la llamada como cero, indicando posiblemente como éxito. ¿Cómo obtener el resultado almacenado en una variable?

+1

ver aquí: http://stackoverflow.com/questions/1410976/equivalent-of-backticks-in-python – georg

Respuesta

26

utilizar el módulo subprocess lugar:

import subprocess 
output = subprocess.check_output("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'", shell=True) 

Editar: esto es nuevo en Python 2.7. En versiones anteriores esto debería funcionar (con el comando reescrito como se muestra a continuación):

import subprocess 
output = subprocess.Popen(['awk', '/f89e7000/ {print $2}', 'syscall_list.txt'], stdout=subprocess.PIPE).communicate()[0] 

Como nota al margen, puede volver a escribir

cat syscall_list.txt | grep f89e7000 

Para

grep f89e7000 syscall_list.txt 

Y incluso puede reemplazar toda la instrucción con un solo script awk:

líder a:

import subprocess 
output = subprocess.check_output(['awk', '/f89e7000/ {print $2}', 'syscall_list.txt']) 
+0

Estoy usando Python 2.6.6 y me da error: ' AttributeError: el objeto 'module' no tiene ningún atributo 'check_output' ' – user567879

+0

@ user567879, Tienes razón. Esta función fue agregada en Python 2.7. Voy a editar en un método para Python 2.6. –

+0

¿Qué sucede si necesito pasar una variable de python como argumento al comando de shell ejecutado? – user567879

9

commands.getstatusoutput funcionaría bien para esta situación.

import commands 
print(commands.getstatusoutput("cat syscall_list.txt | grep f89e7000 | awk '{print $2}'")) 
+0

¡Eres mi héroe! – quickshiftin

+0

El enlace no funciona más y esto se elimina en 3.x Ver https://docs.python.org/2/library/commands.html – user3885927

0

Todas las otras respuestas aquí son excelentes respuestas. En muchas situaciones, necesita ejecutar comandos externos.

Este ejemplo específico tiene otra opción: puede leer el archivo, procesarlo línea por línea y hacer algo con la salida.

Si bien esta respuesta no funciona para la "pregunta más general que se hace", creo que siempre debe tenerse en cuenta. No siempre es la "respuesta correcta", incluso cuando sea posible. Recordar esto (más fácil) y saber cuándo (no) aplicarlo (más difícil) lo convertirá en un mejor programador.

Cuestiones relacionadas