2009-06-17 18 views
8

sto cercando di avviare un processo figlio e ottenere la sua uscita su Linux da Python utilizzando il modulo sottoprocesso:Popen.communicate() genera OSError: "[Errno 10] Non ci sono processi figli"

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

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

Tuttavia, provo una certa anomalia: a volte, p.communicate() getterebbe

OSError: [Errno 10] No child processes 

che cosa può causare questa eccezione? C'è qualche non determinismo o condizione di razza qui che può causare sfogo?

+0

Quale versione di Python stai usando? Funziona bene per me se prendo 'extra_args' – sqram

risposta

3

si potrebbe essere in esecuzione nel bug menzionato qui: http://bugs.python.org/issue1731717

+1

Se è questo errore, considera l'aggiornamento del tuo python a 2.5/2.6. È stato risolto – kjfletch

+2

A partire dal 2010-09-29 il bug è ancora contrassegnato come "open/need patch" e influenza la versione 3.2, 3.1, 2.7, 2.6. – fotinakis

0

io non sono in grado di riprodurre questo sul mio Python (2.4.6-1ubuntu3). Come stai gestendo la tua sceneggiatura? Quanto spesso accade?

0

Mi sono imbattuto in questo problema utilizzando Python 2.6.4 che ho incorporato nella mia directory home (perché non voglio aggiornare il Python "integrato" sulla macchina).

Ho lavorato intorno sostituendo subprocess.Popen() con (deprecato) os.popen3().

6

Stai intercettando SIGCHLD nella sceneggiatura? Se si è quindi Popen non verrà eseguito come previsto poiché si basa sul proprio gestore per quel segnale.

È possibile verificare la presenza di gestori di SIGCHLD commentando la chiamata Popen e poi eseguire:

strace python <your_script.py> | grep SIGCHLD 

se si vede qualcosa di simile a:

rt_sigaction(SIGCHLD, ...) 

allora, sei nei guai. Devi disabilitare l'handler prima di chiamare Popen e poi resettarlo dopo che la comunicazione è stata fatta (questo potrebbe introdurre condizioni di gara quindi fai attenzione).

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) 

C'è un bug pitone riportato su questo e per quanto vedo io non è stato ancora risolto:

http://bugs.python.org/issue9127

Speranza che aiuta.

+0

Ciao http://bugs.python.org/issue9127 visitato il collegamento ma non ho potuto capire in quale versione di Python il problema è stato risolto. Puoi aiutarmi con lo stesso. –

+0

Ecco un elenco di versioni che risolvono questi problemi http://bugs.python.org/issue1731717#msg260457 –

+0

Il messaggio e il collegamento condiviso sopra non sembrano essere corretti, dal momento che secondo le versioni in cui il bug è archiviato Python 3.1, Python 3.2, Python 2.7, Python 2.6 queste versioni di Python sono menzionate in cui è stato trovato il bug. –

Problemi correlati