2009-06-17 25 views
8

Estoy tratando de poner en marcha un proceso hijo y obtener su salida en Linux desde Python usando el módulo de subproceso:Popen.communicate() lanza OSError: "[Errno 10] No hay procesos secundarios"

#!/usr/bin/python2.4 
import subprocess 

p = subprocess.Popen(['ls', '-l', '/etc'], 
        stdout=subprocess.PIPE, 
        stderr=subprocess.PIPE) 
out, err = p.communicate() 

Sin embargo, experimento alguna descamación: a veces, p.communicate() arrojaría

OSError: [Errno 10] No child processes 

lo que puede causar esta excepción? ¿Hay alguna condición de raza o no determinismo que pueda causar flakiness?

+0

¿Qué versión de python estás usando? Funciona bien para mí si saco 'extra_args' – sqram

Respuesta

3

Usted puede ser que funcione en el error mencionado aquí: http://bugs.python.org/issue1731717

+1

Si es este error, considere actualizar su python a 2.5/2.6. Ha sido resuelto – kjfletch

+2

A partir del 2010-09-29, el error todavía está marcado como "abrir/necesita parche" y afecta a la versión 3.2, 3.1, 2.7, 2.6. – fotinakis

0

No soy capaz de reproducir esto en mi Python (2.4.6-1ubuntu3). ¿Cómo estás ejecutando tu script? ¿Con qué frecuencia ocurre esto?

0

Me encontré con este problema usando Python 2.6.4 que construí en mi directorio personal (porque no quiero actualizar el Python "incorporado" en la máquina).

Trabajé alrededor reemplazando subprocess.Popen() con (la obsoleta) os.popen3().

6

¿Está interceptando SIGCHLD en el guion? Si es así, Popen no se ejecutará como se espera, ya que depende de su propio controlador para esa señal.

Puede comprobar si hay controladores SIGCHLD comentando la llamada Popen y ejecutando:

strace python <your_script.py> | grep SIGCHLD 

si ve algo similar a:

rt_sigaction(SIGCHLD, ...) 

a continuación, usted está en problemas. Debe desactivar el controlador antes de llamar a Popen y luego reiniciarlo después de que se haya completado la comunicación (esto podría introducir condiciones de carrera, así que tenga cuidado).

signal.signal(SIGCHLD, handler) 
... 
signal.signal(SIGCHLD, signal.SIG_DFL) 
''' 
now you can go wild with Popen. 
WARNING!!! during this time no signals will be delivered to handler 
''' 
... 
signal.signal(SIGCHLD, handler) 

Hay un error pitón informó sobre esto y por lo que veo que no se ha resuelto todavía:

http://bugs.python.org/issue9127

Espero que ayude.

+0

Hola http://bugs.python.org/issue9127 visité el enlace pero no pude determinar en qué lanzamiento de Python se solucionó el problema. Puedes ayudarme con lo mismo. –

+0

Aquí hay una lista de versiones que resuelve estos problemas http://bugs.python.org/issue1731717#msg260457 –

+0

El mensaje y el enlace compartido anteriormente no parece ser correcto, ya que según las versiones en las que se archivó el error Python 3.1, Python 3.2, Python 2.7, Python 2.6 se mencionan estas versiones de Python en las que se encontró el error. –

Cuestiones relacionadas