2009-06-17 9 views
8

Je suis en train de commencer un processus enfant et obtenir sa sortie sur Linux à partir de Python à l'aide du module de sous-processus:Popen.communicate() renvoie OSError: "[Errno 10] Aucun processus enfant"

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

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

Cependant, je constate une certaine friabilité: parfois, p.communicate() jetterait

OSError: [Errno 10] No child processes 

Que peut faire cette exception? Y a-t-il ici un non-déterminisme ou une condition de concurrence qui peut causer une desquamation?

+0

Quelle version de python utilisez-vous? Cela fonctionne très bien si je sors 'extra_args' – sqram

Répondre

3

Vous pourriez être en cours d'exécution dans le bogue mentionné ici: http://bugs.python.org/issue1731717

+1

Si c'est ce bug, pensez à mettre votre python à jour en 2.5/2.6. Il a été résolu. – kjfletch

+2

En date du 2010-09-29, le bogue est toujours marqué comme "open/needs patch" et affecte la version 3.2, 3.1, 2.7, 2.6. – fotinakis

0

Je ne suis pas en mesure de reproduire sur mon Python (2.4.6-1ubuntu3). Comment gérez-vous votre script? À quelle fréquence cela se produit-il?

0

je suis tombé sur ce problème en utilisant Python 2.6.4 que je construit dans mon répertoire personnel (parce que je ne veux pas mettre à niveau le Python « intégré » sur la machine).

J'ai travaillé autour de lui en remplaçant subprocess.Popen() avec (le désapprouvé) os.popen3().

6

interceptent vous SIGCHLD dans le script? Si vous êtes alors Popen ne fonctionnera pas comme prévu, car il dépend de son propre gestionnaire pour ce signal.

Vous pouvez vérifier les gestionnaires SIGCHLD en commentant l'appel Popen puis en cours d'exécution:

strace python <your_script.py> | grep SIGCHLD 

si vous voyez quelque chose de similaire à:

rt_sigaction(SIGCHLD, ...) 

alors, vous êtes en difficulté. Vous devez désactiver le gestionnaire avant d'appeler Popen et ensuite le réinitialiser après que la communication soit faite (cela pourrait introduire des conditions de course alors méfiez-vous).

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) 

Il y a un bug python rapporté à ce sujet et pour autant que je vois qu'il n'a pas été encore résolu:

http://bugs.python.org/issue9127

espoir qui aide.

+0

Salut http://bugs.python.org/issue9127 visité le lien, mais n'a pas pu déterminer dans quelle version de python le problème est résolu. Pouvez-vous m'aider avec la même chose. –

+0

Voici une liste des versions qui résout ces problèmes http://bugs.python.org/issue1731717#msg260457 –

+0

Le message et le lien partagé ci-dessus semble pas être correct, puisque selon les versions dans lesquelles le bogue est déposé Python 3.1, Python 3.2, Python 2.7, Python 2.6 ces versions de Python sont mentionnées dans lesquelles le bug a été trouvé. –

Questions connexes