utilisant Python 2.6.1 sous Mac OS X 10.6.2, j'ai le problème suivant:pipe.communicate appelant Python() dans un thread
J'ai un processus fileté (une classe de discussion), et chaque de ces fils comporte un tuyau (a subprocess.Popen) quelque chose likeso:
from threading import Thread
cmd = "some_cmd"
class Worker(Thread):
def run(self):
pipe = Popen(cmd,
stdin=PIPE,
stdout=PIPE,
stderr=PIPE)
out, err = pipe.communicate("some data")
le problème est que le code pipe.communicate() est bloquant. Fait intéressant, lorsque j'ai envoyé une interruption (par exemple Ctrl-C
KeyboardInterrupt) au processus parent, il se débloque.
Fait intéressant, quand j'utilise class Worker(multiprocessing.Process)
, le code fonctionne très bien.
Toute idée à savoir pourquoi cela bloque - et comment y remédier - serait grandement appréciée.
Merci.
Juste trouvé http://stackoverflow.com/questions/984941/python-subprocess-popen-from-a-thread - cependant je ne suis pas sûr de ce que le correctif est (encore)! –
Il semblerait que Popen ne soit pas compatible avec les threads. Soyez très obligé pour une correction ou une clarification. Trouvé http://mail.python.org/pipermail/python-bugs-list/2007-August/039177.html sur le sujet. –
communiquent() est supposé bloquer. Voulez-vous dire qu'il bloque tout le programme et pas seulement le fil sur lequel il tourne? Pourriez-vous fournir un exemple de programme complet? –