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