Sigue: Paso de comandos a un programa desde Python
Chema Cortes
chemacortes en wanadoo.es
Mar Sep 10 09:53:23 CEST 2002
> Gracias Hernán, pero aún tengo problemas.
>
> OVERNET = "./overnet0.29.1"
>
> import popen2
> import time
>
> salida, entrada = popen2.popen2 (OVERNET)
>
> while (1):
>
> entrada.write("?")
>
> lin = salida.read(128)
>
> print lin
>
> time.sleep (10)
>
> El caso es que el programa se para en la instrucción lin = salida.read(32). He
> probado con otros tamaños de buffer pero nada. También he probado con otros
> métodos de file (readline, redlines...) con el mismo resultado. He utilizado
> popen2 y popen4 con los mismos resultados, no hay mensaje de error pero se
> para.
Este bloqueo de los pipes de entrada/salida son muy conocidos. Intentas leer de la salida del comando, justo cuando éste intenta leer de la entrada. Ambos procesos se quedan en espera indefinida.
En Unix/Linux se puede emplear el módulo "select" para conocer si un proceso está esperando una entrada, o si hay datos en la salida. Yo lo he probado, pero me resultó muy complicado y no conseguí que me funcionara.
La mejor solución solución que he visto está aquí: http://www.faqts.com/knowledge_base/view.phtml/aid/4448 . En este código se emplea el truco de crear procesos hijos (forks) que sólo leen ó sólo escriben, evitando completamente los bloqueos. Podrás adaptar la idea a tu caso en particular.
> Otra cosa, como podría ir guardando un log de las salidas del programa? La
> verdad que no sé cómo acceder al fichero salida.
No entiendo la pega. Al crear los pipes tienes acceso a la entrada y salida del comando. Para almacenar el log, basta con ir guardando la salida del comando.
Saludos,
--
Chema Cortes (chemacortes en wanadoo.es)
_____________________________________________________________________
Horas ilimitadas para leer y enviar correos con Tarifa Plana Wanadoo
¡¡ desde las 3 de la tarde!!
Compruébalo en http://www.wanadoo.es/acceso-internet
Más información sobre la lista de distribución Python-es