una pregunta sobre popen3

Chema Cortés ch3m4 en ch3m4.org
Mar Jun 24 13:38:45 CEST 2003


Jesús Roncero escribió:
> Hola, estoy programando un pequeño script que llama a  un programa y me 
> gustaría tratar con la salida de este programa. He estado viendo en la 
> documentación que tengo que usar la función popen3 para que me devuelva el 
> stdout,stdin y stderr del programa que ejecuto. Leyendo la documentación en 
> http://www.python.org/doc/current/lib/module-popen2.html
> veo que dice que si quiero capturar también el valor devuelto por el programa 
> debo usar la clase Popen3. Me gustaría saber si este código está bien y es 
> así como hay que usarlo:
> 
> from popen2 import *
> a = Popen3("ls")
> if a.wait() == 0:
> 	# a.fromchild tiene la salida
> 	print a.fromchild.readlines()
> else
> 	print "se produjo un error"

Está correcto. Lo único es que si sólo querías controlar la salida del 
comando tal vez hubiera sido más sencillo usar el popen del módulo os:

import os

salida=os.popen("ls 2>&1")  #stdout+stderr
s=salida.read()
errno=salida.close()

> ¿qué diferencia hay entre el método poll y wait? Y, en caso de error, ¿como 
> habría que tratarlo, sacando el error de a.childerr ?

'poll' testea y sigue; 'wait' espera a que acabe el proceso.

Para conocer el código exit:

# con poll
a=popen2.Popen3("ls")
while a.poll()==-1:
   pass
print "EXIT CODE:",a.poll()

# con wait
a=popen2.Popen3("ls")
status=a.wait()
if os.WIFEXITED(status):
   print "EXIT CODE:",os.WEXITSTATUS(status)




Más información sobre la lista de distribución Python-es