J'essaie de lancer un 'rsync' en utilisant un module de sous-processus et Popen à l'intérieur d'un thread. Après avoir appelé le rsync, j'ai besoin de lire la sortie. J'utilise la méthode de communication pour lire la sortie. Le code fonctionne correctement lorsque je n'utilise pas de thread. Il semble que lorsque j'utilise un thread, il se bloque sur l'appel de communication. Une autre chose que j'ai remarquée est que quand je mets shell = False je ne reçois rien de la communication quand je cours dans un thread.Python Subprocess.Popen à partir d'un thread
21
A
Répondre
33
Vous n'avez pas fourni de code pour nous à regarder, mais voici un exemple qui fait quelque chose de semblable à 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
9
Voici une grande mise en œuvre n'utilisant des fils: constantly-print-subprocess-output-while-process-is-running
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'])
+4
Il convient de noter que cette implémentation bloquera sur 'process.stdout.readline()'. – Ian
Questions connexes
- 1. capture stderr à partir de python subprocess.Popen (commande, stderr = subprocess.PIPE, stdout = subprocess.PIPE)
- 2. Python thread dump
- 3. sortie de la console Désactiver de subprocess.Popen en Python
- 4. subprocess.Popen erreur
- 5. Manipulation d'un thread à partir d'un thread différent
- 6. Invoquer à partir de thread différent
- 7. thread automatique à partir de tomcat
- 8. python quitte un thread de blocage?
- 9. Comment obtenir la sortie de subprocess.Popen()
- 10. Comment appeler une fonction python à partir d'un thread de langue étrangère (C++)
- 11. Existe-t-il un moyen d'interroger un handle de fichier renvoyé à partir de subprocess.Popen?
- 12. Thread WPF et GUI comment accéder à l'objet à partir de thread différent?
- 13. Jointure de thread interruptible en Python
- 14. Thread simple en Python 2.6 utilisant thread.start_new_thread()
- 15. Écrire dans un TextBox à partir d'un autre thread?
- 16. Comment récupérer gracieusement à partir de TargetInvocationException dans multi thread?
- 17. Obtention d'événements à partir d'un thread en toute sécurité
- 18. Puis-je appeler stream.Fermer à partir d'un autre thread?
- 19. Comment générer plusieurs scripts python à partir d'un programme python?
- 20. lancer VS2008 construire à partir de python
- 21. Scripting LMMS à partir de Python
- 22. Appelez Python à partir de C++
- 23. Python: référence à une classe à partir d'une chaîne?
- 24. Python pour S60: Ecoute d'une socket en thread sparate
- 25. C# Thread in Thread: comment obtenir SynchronizationContext.Current?
- 26. Comment puis-je savoir pourquoi subprocess.Popen wait() attend toujours si stdout = PIPE?
- 27. Comment puis-je corriger l'erreur "accédé à partir d'un thread autre que le thread sur lequel il a été créé"?
- 28. Opération croisée pas valide: Contrôle accédé à partir d'un thread autre que le thread sur lequel il a été créé
- 29. Interception en temps réel de stdout à partir d'un autre processus en Python
- 30. appelant un rappel à partir d'un thread à l'aide de pointeurs de fonction
Oui c'est à peu près exactement ce que je fais. J'aimerais bien lire la sortie dans le fil. Je devrais également noter que j'utilise Python 2.3. J'ai saisi une copie du sous-processus de 2.4. – noahd
alors s'il vous plaît marquer cela comme "répondu" –
Je devrais être plus clair que c'est ce que je fais, mais cela ne fonctionne pas. Dans ce cas, l'appel de communication ne retournera rien et la commande ne semble pas s'exécuter. Si je mets shell = True la communication bloque le thread. Ensuite, après avoir arrêté le python, je me retrouve avec un processus ssh défunt. – noahd