[pyar] subprocess.Popen con timeout

claudio canepa ccanepacc en gmail.com
Mie Mayo 9 00:20:22 ART 2012


Necesito ejecutar scripts python bajo control de otro script python,
capturando stderr y stdout.

La forma recomendada de hacer esto parece ser usar subprocess.Popen, pero
los pythons actuales no soportan especificarle un timeout para que si la
ejecucion no termina en timeout segundos el subproceso sea matado. (esto es
algo que se va a agregar en python 3.3 [0])

Encontre algunas recetas y comentarios, pero las recetas no corrian o
fallaban en windows.

Mezclando, modificando y haciendo pruebas mi mejor version cumple (en win
xp 32bits + python 2.6.6):
+ timeout es siempre respetado
+ si el script del subprocess termina antes de que se dispare el timeout,
se captura todo stderr y stdout (al menos con len(stream)<1MB)

Lo que no es tan bueno, pero puedo vivir con ello, es que si el script
muere por timeout los ultimos len(stream) % 4KB se pierden.

Lo que necesitaria verificar ahora es si lo que hice funciona tambien con
otras variantes de OS y python.

A los que se copen en colaborar, el procedimiento es sencillo

$ hg clone https://bitbucket.org/ccanepa/remembercases somedir
$ cd somedir/remembercases/test
$ python test_cmd_timeout.py

Esto deberia producir una corriente de prints en la consola, y cada print
no deberia tardar mas de cuatro segundos (timeout esta puesto a 3 segundos).
En total en mi maquina tomó 1 minuto 10 secs para correrlo, asi que es
rapido.

Bueno, precisaria que metan la salida que obtengan (o problemas que
encontraron) como un attach en un comentario del issue
https://bitbucket.org/ccanepa/remembercases/issue/1/feedback-about-cmd_timeout
poniendo en el cuerpo del comentarion en que OS y python lo corrieron
(incluyendo si es 32/64bits)

Si quieren ver el codigo sin bajarlo, pueden mirar en el repo [1]
remembercases/test/test_cmd_timeout.py : El ejercitador de la funcion de
interes
remembercases/test/size_gen.py : El fake para test del script a correr como
subproceso
remembercases/cmd_timeout.py : El modulo que contiene dos implementaciones
para la funcion que interesa

Gracias por adelantado, y cualquier cosa pregunten

claudio

[0] http://bugs.python.org/issue5673
[1] https://bitbucket.org/ccanepa/remembercases/src

--
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20120509/1771c643/attachment.html>


More information about the pyar mailing list