Funcion Popen.

Juan Carlos Sey seymurx en gmail.com
Lun Mayo 28 05:54:54 CEST 2007


Un saludo a todos, es mi primer mensaje.

Lei una cuestion muy interesante en esta lista de otro miembro...

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)

Estuve buscando este metodo para comunicarme con un motor de Ajedrez, en
concreto el engine "Crafty" para quien no sepa de que hablo, es basicamente
un programa en consola msdos al que puedes introducir los movimientos
directamente por teclado, es habitual que otros programas usen estos motores
como corazon del interfaz.

Investigo la forma de comunicarme con el motor y gracias al compañero parece
que me acerco al problema.

import os
salida=os.popen("crafty.exe")  #stdout+stderr
s=salida.read()
print s

Este sencillo codigo me permite ver la salida del programa desde Python
(genial lenguaje, aunque estoy empezando) lo que se me escapa es como enviar
los movimientos, osea veo el out, alguna pista de como hacer lo inverso? el
input?.

Muchas Gracias.




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