clase Popen3 en Windows

Gema Núñez Blázquez gema_alf en yahoo.es
Vie Oct 3 13:20:07 CEST 2003


Creo que he dado con la solucion. El problema es que al crear la tuberia tienes dos manejadores el de lectura y el de escritura y yo estaba leyendo el de escritura que estaba bloqueado.
 
Ahora tengo otros problemas pero esos son mas faciles de solucionar:
- Solo obtengo la salida del proceso padre, es decir si el proceso creado lanza a su vez a otro programa no obtengo la salida de ese otro programa, pero eso creo poder solucionarlo reescribiendo el proceso padre.
-Si el proceso acaba muy pronto no llego a capturar la salida porque la tuberia ya esta cerrada, pero eso no me importa porque si detecto que ha terminado con status ok me vale.
 
Muchas gracias por tu ayuda me ha servido de mucho.
 
import win32process
import win32pipe
import win32api
import win32con
import win32security
import win32file
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
    sAttrs=win32security.SECURITY_ATTRIBUTES()
    sAttrs.bInheritHandle = 1;
    hPipeIn_r, hPipeIn_w=win32pipe.CreatePipe(sAttrs, 0)
    hPipeOut_r,hPipeOut_w=win32pipe.CreatePipe(sAttrs,0)
    si = win32process.STARTUPINFO()
    si.dwFlags = win32process.STARTF_USESTDHANDLES
    si.hStdInput=hPipeIn_r
    si.hStdOutput=hPipeOut_w
    # create the process
    processhandle, threadhandle,pid, 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(processhandle))
        if (win32process.GetExitCodeProcess(processhandle) >=1):#codigo del proceso
            if contador==0:
                print 'Termino el proceso'
                win32api.TerminateProcess(processhandle,-1)
                break
            buffer, bytesToRead, ignore = win32pipe.PeekNamedPipe(hPipeOut_r, 0)
            if bytesToRead > 0:
                hr, data = win32file.ReadFile(hPipeOut_r, bytesToRead, None)
                print 'valor salida '+str(data)
            contador=contador-1
            time.sleep(5)
        else:
            print 'salgo del bucle'
            break    


Chema_Cortés <ch3m4 en ch3m4.org> wrote:
Gema Núñez Blázquez escribió:

> Ahora el problema que me da es que no tengo acceso a la tuberia, como si 
> estuviera bloqueada por el proceso y no me dejara leer mientras esta 
> escribiendo. La excepcion es la siguiente:
> 
> Traceback (most recent call last):
> File "pruebaWin32Process3.py", line 54, in ?
> pywintypes.api_error: (5, 'GetNamedPipeHandleState', 'Acceso denegado.')

Creo que faltaba añadir una línea para que el proceso hijo se entere del 
pipe:

sAttrs=win32security.SECURITY_ATTRIBUTES()
sAttrs.bInheritHandle=1 # <-- *falta esta línea*

Si todavía no funciona, tal vez sea porque no vayan bien las pipes 
anónimas (no sé donde leí que daban problemas en algunas versiones de 
windows...espera, lo he encontrado: 
http://mail.python.org/pipermail/python-list/1999-June/004919.html). 
Prueba a utilizar win32pipe.CreateNamedPipe a ver si va mejor.

Me es imposible ahora probarlo yo mismo, así que espero que sea ésta la 
solución.


-- 
Res publica non dominetur


_______________________________________________
Python-es mailing list
Python-es en aditel.org
http://listas.aditel.org/listinfo/python-es

---------------------------------
Yahoo! Messenger
Nueva versi&oacute;n: Super Webcam, voz, caritas animadas, y m&aacute;s #161;Gratis!
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20031003/8db6b033/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