[pyar] subprocess.Popen con timeout

david weil tenuki en gmail.com
Mie Mayo 9 04:12:48 ART 2012


2012/5/9 claudio canepa <ccanepacc en gmail.com>:
> 2012/5/9 Claudio Freire <klaussfreire en gmail.com>
>> Mirá vos. Yo tuve una necesidad parecida una vez, y usé otra forma[0],
>> capaz no de lo más linda, pero sin threads.
>> Nunca la probé en windows, pero no veo por qué no funcionaría, pues
>> reimplementé communicate() usando timeouts en los select(), cosa que
>> windows debería soportar diría bien.
>
> mmm... Me parece recordar que en los comentarios de algunas soluciones
> propuestas se comentaba que select no servia para windows, y veo en los docs
> de module select de python 2.6:
>
> """
> Note that on Windows, it only works for sockets; on other operating systems,
> it also works for other file types (in particular, on Unix, it works on
> pipes).
> """

No leí aún como lo estás haciendo. Pero como también tuve algunos
problemas con esas cosas, te comento otras que se pueden hacer:

1. lo que decís del select es un motivo de porqué no funciona en windows.
2. la alternativa "windows-way" al select sobre files:
waitforsingleobject(.., handle, .. timeout).
3. para eso necesitas dos cosas:
-crear el file con / para acceso asincrónico:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa363858(v=vs.85).aspx
-> buscá overlapped i/o, entonces se usa: ctypes.
-tener el handle del file (no me acuerdo si con myfile.fileno te lo devuelve)
-creo que despues de que tenes createfile() y waitforsingleobject(),
el resto de las cosas las podés hacer con os.fdread() de a 1
caracter.. pero creo que también hay una forma (que no me acuedo
ahora) de crear un objeto file de python a partir de un file
descriptor/handle y usar file.readlines() etc..

A pesar de todo, recuerdo también, haber tenido, en algún momento, el
problema que mencionas de que aparentemente los ultimos
len(outputstream)%4kb no me llegaban.
Pero ahora no estoy seguro de si fue antes de haber hecho todo esto o no.. :-o

Y también encontré algunos problemas horribles, con tools mismas del
"sistema operativo", que chequean que el handle de donde están tomando
el input sea el número 3 (sí sí) y sinó tienen comportamiento
errático. Para ellas, una solución que encontramos es hacer
createprocess() e indicar que cree una nueva consola.. etc..

Avisa si vas a probar estas cosas..
Saludos,
dave
-- 
 There is no dark side of the moon really. Matter of fact it's all dark.



More information about the pyar mailing list