2010-01-20 39 views
10

En Python necesito obtener la versión de un binario externo al que debo llamar en mi script.Analizando un stdout en Python

Digamos que quiero usar Wget en Python y quiero saber su versión.

llamaré

os.system("wget --version | grep Wget") 

y luego voy a analizar la cadena impresa.

Cómo redireccionar la stdout de os.command en una cadena en Python?

+1

duplicado: http://stackoverflow.com/questions/89228/how-to-call-external-command-in-python – SilentGhost

Respuesta

34

Una forma de "viejo" es:

fin,fout=os.popen4("wget --version | grep Wget") 
print fout.read() 

La otra forma moderna es utilizar un módulo subprocess:

import subprocess 
cmd = subprocess.Popen('wget --version', shell=True, stdout=subprocess.PIPE) 
for line in cmd.stdout: 
    if "Wget" in line: 
     print line 
+0

Gracias ghostdog75! AFeG –

+0

¿Cuál es la "nueva" forma? El subproceso –

+1

es nuevo desde Python 2.4. – kroiz

0

Use subprocess en su lugar.

+1

Gracias Ignacio! AFeG –

+0

'Subprocess.popen' llama al comando shell para analizar y ejecuta un proceso adicional en Python. –

+0

@Grijesh: Solo si se lo dices. –

9

Uso del módulo subprocess:

from subprocess import Popen, PIPE 
p1 = Popen(["wget", "--version"], stdout=PIPE) 
p2 = Popen(["grep", "Wget"], stdin=p1.stdout, stdout=PIPE) 
output = p2.communicate()[0] 
-1

Si están en * nix, le recomendaría que use el módulo de comandos.

import commands 

status, res = commands.getstatusoutput("wget --version | grep Wget") 

print status # Should be zero in case of of success, otherwise would have an error code 
print res # Contains stdout 
+0

mal consejo: no existe en py3k, docs say: Usar el módulo ** 'subprocess' ** es preferible al uso de módulo de comandos. – SilentGhost