2011-04-06 32 views
9

Tengo un script de python que ejecuta un ciclo en el que llama un programa A a través de un subproceso. Popen espera su salida, luego guarda el salida y luego lo llama de nuevo y así sucesivamente. (Esto sigue sucediendo durante varias ejecuciones que establecí como entrada)WindowsError: [Error 5] Acceso denegado al intentar eliminar un subproceso (python)

Lo que pasa es que tengo un temporizador para que cada vez que el programa A tome más de un threshold_time en particular, la secuencia de comandos mate el proceso con process.kill () y pasa a la siguiente iteración.

El problema es que a pesar de que todo parece funcionar bien, incluso durante 300 carreras, a veces me sale este error:

File "C:\Python27\lib\subprocess.py", line 1002, in terminate 
    _subprocess.TerminateProcess(self._handle, 1) 
    WindowsError: [Error 5] Access is denied 

y luego muere el guión.

La parte de la escritura se hace referencia:

timeout = TIME_CONST 
for run in runs: 
    killed = False 
    start = time.clock() 
    p = subprocess.Popen("SOME.CMD", cwd=r"some_dir") 
    # Monitor process. If it hits threshold, kill it and go to the next run 
    while p.poll() is None: 
     time.sleep(20) 
     secs_passed = time.clock() - start 

     ### the following was my initial buggy line ### 
     #if secs_passed >= timeout: 

     ### corrected line after jedislight's answer ### 
     #if the time is over the threshold and process is still running, kill it 
     if secs_passed >= timeout and p.poll is None: 
      p.kill() 
      killed = True 
      break 
    if killed: continue 

¿Tiene alguna sugerencia lo que podría ser el problema?

EDIT: Respondió la respuesta y corrigió el código. ¡Gracias @jedislight por tus comentarios!

+0

¿Se puede publicar la secuencia de comandos de Python más pequeña que pueda reproducir este comportamiento? –

+0

@Sridhar Agregué el código que solicitó. – Galois

+0

Lo intenté con "SOME.CMD" siendo solo "cmd" y funcionó. ¿Cuál es tu proceso que estás tratando de matar? – Fenikso

Respuesta

6

Usted está separando su p.poll() y su p.kill() por 20 segundos. Para entonces, el proceso podría haber terminado. Sugeriría mover la llamada time.sleep (20) para que la encuesta y matar sucedan en el mismo marco de tiempo, para evitar matar a un proceso muerto. A continuación se muestra un ejemplo de gestión en IPython que muestra un error similar al matar un proceso completado:

In [2]: import subprocess 

In [3]: p = subprocess.Popen("dir") 

In [4]: p.poll() 
Out[4]: 0 

In [5]: p.kill() 
--------------------------------------------------------------------------- 
WindowsError        Traceback (most recent call last) 

C:\Users\---\<ipython console> in <module>() 

C:\Python26\lib\subprocess.pyc in terminate(self) 
    947    """Terminates the process 
    948    """ 
--> 949    _subprocess.TerminateProcess(self._handle, 1) 
    950 
    951   kill = terminate 

WindowsError: [Error 5] Access is denied 

Incluso si usted mata directamente después de una encuesta que muestra los procesos en ejecución se puede terminar antes de que se ejecute la siguiente línea. También sugeriría agregar un bloque try-catch para esta excepción y si ocurre una encuesta nuevamente para ver si el proceso realmente se completó.

+0

Creo que tienes razón. Me perdí esa parte. ¡Gracias por notarlo! – Galois

+0

Tengo un problema similar con el paquete librosa/audioread cuando intento leer un archivo mp3. Pero desafortunadamente, el truco try-catch no funciona para mí –

Cuestiones relacionadas