Python Subprocess.Popen à partir d'un thread
j'essaie de lancer un 'rsync' en utilisant le module subprocess et de Popen à l'intérieur d'un thread. Après que j'ai appelé le rsync je dois lire la sortie aussi bien. J'utilise la méthode communicate pour lire la sortie. Le code fonctionne bien quand je n'utilise pas de thread. Il semble que lorsque j'utilise un thread il se bloque sur l'communiquer appel. Une autre chose que j'ai remarqué, c'est que quand je mets shell=False, Je n'obtiens rien en retour de la communication lorsque je cours dans un thread.
2 réponses
vous n'avez pas fourni de code à regarder, Mais voici un échantillon qui fait quelque chose de similaire à ce que vous décrivez:
import threading
import subprocess
class MyClass(threading.Thread):
def __init__(self):
self.stdout = None
self.stderr = None
threading.Thread.__init__(self)
def run(self):
p = subprocess.Popen('rsync -av /etc/passwd /tmp'.split(),
shell=False,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
self.stdout, self.stderr = p.communicate()
myclass = MyClass()
myclass.start()
myclass.join()
print myclass.stdout
Voici une grande implémentation n'utilisant pas les threads: permanence-print-sous-processus-sortie-en-processus qui est en cours d'exécution
import subprocess
def execute(command):
process = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
output = ''
# Poll process for new output until finished
for line in iter(process.stdout.readline, ""):
print line,
output += line
process.wait()
exitCode = process.returncode
if (exitCode == 0):
return output
else:
raise Exception(command, exitCode, output)
execute(['ping', 'localhost'])