clase Popen3 en Windows

Gema Núñez Blázquez gema_alf en yahoo.es
Vie Oct 3 11:37:59 CEST 2003


Gracias, es verdad que estaba cambiado de orden los parametros al crear el proceso, pero el que tengo que utilizar es el manejador del proceso y no el del hilo.
 
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.')
 
Te vuelvo a mandar el codigo por si te sirve de ayuda.
 
import win32process
import win32pipe
import win32api
import win32con
import win32security
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()
    hPipeIn, hPipeOut=win32pipe.CreatePipe(sAttrs, 0)
    si = win32process.STARTUPINFO()
    si.dwFlags = win32process.STARTF_USESTDHANDLES
    si.hStdInput=hPipeIn
    si.hStdOutput=hPipeOut
    # 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, 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ó:
> 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?

Pues yo diría que no, ya que en realidad no has creado ningún pipe. Al 
crear el proceso, en lugar de conectarlo a las entradas/salidas del 
proceso padre deberías conectarlo a un pipe para procesarlas:

sAttrs=win32security.SECURITY_ATTRIBUTES()
hPipeIn, hPipeOut = win32pipe.CreatePipe(sAttrs, 0)

...
si.hStdOutput = hPipeOut


Así mismo, creo que tiene un error en

> # create the process
> phandle, pid, thandle, tid = win32process.CreateProcess \

está mal el orden. Sería (phandle, thandle, pid, tid), siendo thandle el 
handle del proceso hijo, no phandle como parace que estás usando.



-- 
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/37f1f665/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