Popen.communicate () lanza OSError: ” No hay procesos secundarios”

Estoy intentando iniciar un proceso secundario y obtener su salida en Linux desde Python usando el módulo de subproceso:

#!/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 algo de descamación: a veces, p.communicate () lanzaría

 OSError: [Errno 10] No child processes 

¿Qué puede causar esta excepción? ¿Existe aquí alguna condición no determinista o racial que pueda causar descamación?

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

Puede verificar los manejadores SIGCHLD comentando la llamada de Popen y luego ejecutando:

 strace python  | grep SIGCHLD 

Si ves algo similar a:

 rt_sigaction(SIGCHLD, ...) 

entonces, estas en problemas Debe deshabilitar el controlador antes de llamar a Popen y luego restablecerlo después de que se realice 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 de python informado sobre esto y, por lo que veo, aún no se ha resuelto:

http://bugs.python.org/issue9127

Espero que ayude.

Es posible que se encuentre con el error mencionado aquí: http://bugs.python.org/issue1731717

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

Me encontré con este problema usando Python 2.6.4 que incorporé en mi directorio de inicio (porque no quiero actualizar Python “incorporado” en la máquina).

Trabajé a su alrededor reemplazando subprocess.Popen() con (el desaprobado) os.popen3() .