clase Popen3 en Windows
Gema Núñez Blázquez
gema_alf en yahoo.es
Jue Oct 2 18:29:31 CEST 2003
Perdonad por ser tan pesada con el temita pero es que no me termina de salir. Siguiendo tu consejo he utilizado win32process y win32pipe, y consigo que el proceso se ejecute y me de el manejador para poder preguntar si sigue vivo. Mi problema es que no soy capaz de leer la tuberia de salida ni de error:
buffer, bytesToRead, ignore = win32pipe.PeekNamedPipe(si.hStdOutput, 0)
print 'valor salida '+str(buffer)
porque me da el siguiente error:
Traceback (most recent call last):
File "pruebaWin32Process3.py", line 47, in ?
pywintypes.api_error: (6, 'GetNamedPipeHandleState', 'Controlador no v\xe1lido.'
)
se supone que el manejador del pipe está en si.hStdOutput, ¿no?
Espero que me deis alguna pista. Muchas gracias
import win32process
import win32pipe
import win32api
import win32con
import os,time
if __name__ == "__main__":
cmdline="D:\\Programa.exe"
"""Creates a new process which uses the specified handles for its standard
input, output, and error. The handles must be inheritable. 0 can be passed
as a special handle indicating that the process should inherit the current
process's input, output, or error streams, and None can be passed to discard
the child process's output or to prevent it from reading any input."""
# initialize new process's startup info
si = win32process.STARTUPINFO()
si.dwFlags = win32process.STARTF_USESTDHANDLES
si.hStdInput = win32api.GetStdHandle(win32api.STD_INPUT_HANDLE)
si.hStdOutput = win32api.GetStdHandle(win32api.STD_OUTPUT_HANDLE)
si.hStdError = win32api.GetStdHandle(win32api.STD_ERROR_HANDLE)
# create the process
phandle, pid, thandle, tid = win32process.CreateProcess \
( None, # appName
cmdline, # commandLine
None, # processAttributes
None, # threadAttributes
1, # bInheritHandles
win32con.NORMAL_PRIORITY_CLASS, # dwCreationFlags
None, # newEnvironment
None, # currentDirectory
si # startupinfo
)
print 'voy a entrar al bucle'
contador=2 #contador de espera
while 1:
print 'iteracion '+str(win32process.GetExitCodeProcess(phandle))
if (win32process.GetExitCodeProcess(phandle) >=1):#codigo del proceso
if contador==0:
print 'Termino el proceso'
win32api.TerminateProcess(phandle,-1)
break
buffer, bytesToRead, ignore = win32pipe.PeekNamedPipe(si.hStdOutput, 0)
print 'valor salida '+str(buffer)
contador=contador-1
time.sleep(10)
else:
print 'salgo del bucle'
break
Chema_Cortés <ch3m4 en ch3m4.org> wrote:Gema Núñez Blázquez escribió:
> Mi aplicacion lanza procesos y va visualizando la salida y los errores
> de dicho proceso, esa parte la hago con popen3 y me funciona. Lo que me
> gustaria es poder conseguir los pid de los procesos que lanzo para que
> cuando termine la aplicacion asegurarme si han concluido y sino matarlos
> yo misma.
>
> En la ayuda hay una clase Popen3 que me da eso, pero pone que no esta
> disponible para la plataforma Windows (y yo estoy trabajando en esta
> plataforma), me podeis decir como puedo hacer esto.
Nunca los he tenido que utilizar, pero supongo que deberías utilizar los
módulos win32pipe y win32process de las extensiones win32all
--
Res publica non dominetur
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es
---------------------------------
Yahoo! Messenger
Nueva versión: Super Webcam, voz, caritas animadas, y más #161;Gratis!
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20031002/7ede3c72/attachment.html>
------------ próxima parte ------------
_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es
Más información sobre la lista de distribución Python-es