Ich versuche, ein 'rsync' mit Subprozess-Modul und Popen innerhalb eines Threads zu starten. Nachdem ich das rsync aufgerufen habe, muss ich auch die Ausgabe lesen. Ich verwende die Kommunikationsmethode, um die Ausgabe zu lesen. Der Code läuft gut, wenn ich keinen Thread verwende. Es scheint, dass wenn ich einen Thread verwende, er an dem Kommunikationsaufruf hängt. Eine andere Sache, die ich bemerkt habe, ist, dass wenn ich shell = False setze, bekomme ich nichts zurück von der Kommunikation, wenn ich in einem Thread laufe.Python Subprocess.Popen von einem Thread
21
A
Antwort
33
Sie liefern keinen Code für uns zu sehen, aber hier ist ein Beispiel, das etwas ähnliches tut, was Sie beschreiben:
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
Hier ist eine große Implementierung nicht Threads: 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
Es sollte beachtet werden, dass diese Implementierung auf 'process.stdout.readline()' blockiert. – Ian
Verwandte Themen
- 1. Ausnahmebehandlung, wenn Python subprocess.Popen
- 2. Bessere Multithread-Nutzung von Python subprocess.Popen & communicate()?
- 3. Python-Umleitung in subprocess.Popen
- 4. verhindern subprocess.Popen von der Ausgabe in Python
- 5. Prüfstatus von Prozess mit subprocess.Popen in Python
- 6. Disable Konsolenausgabe von subprocess.Popen in Python
- 7. Ausgabe von subprocess.Popen ignorieren
- 8. Escaping Zeichenfolgen in Python subprocess.Popen
- 9. Python subprocess.Popen in anderem Verzeichnis
- 10. Asynchron gelesen stdout von subprocess.Popen
- 11. subprocess.Popen mit einem Unicode-Pfad
- 12. Wie subprocess.Popen richtig funktioniert?
- 13. subprocess.Popen mit relativen Pfaden
- 14. subprocess.Popen in verschiedenen Konsole
- 15. Python - Limit Menge von Daten subprocess.Popen kann produzieren
- 16. Verwenden einer Variable in einem subprocess.Popen Befehl
- 17. Wie bekomme ich Ausgabe von subprocess.Popen()
- 18. Ist subprocess.Popen nicht threadsicher?
- 19. Ausführen eines Python-Skripts mit subprocess.Popen() in einer Django-Ansicht
- 20. Background Process subprocess.Popen mit Pipe
- 21. Erfassen der Ausgabe von subprocess.Popen() mit Nase
- 22. subprocess.Popen optionale Argumente
- 23. Python-Thread-Dump
- 24. subprocess.Popen: wie eine Liste als Argument übergeben
- 25. subprocess.Popen - stdin erneut umleiten
- 26. Echtzeitausgabe von subprocess.popen() und nicht Zeile für Zeile
- 27. Thread-Sperre in Python
- 28. Python - Update-Thread-Variable
- 29. Sehr große Eingabe und Verrohrung mit subprocess.Popen
- 30. Python, Thread und Gobject
Ja das ist ziemlich genau was ich mache. Ich möchte jedoch die Ausgabe innerhalb des Threads gelesen werden. Ich sollte auch beachten, dass ich Python 2.3 verwende. Ich habe eine Kopie des Subprozesses von 2.4. – noahd
dann bitte markieren Sie diese als "beantwortet" –
Ich sollte klarer sein, dass das ist, was ich tue, aber es funktioniert nicht. In diesem Fall gibt der Kommunikationsaufruf nichts zurück und der Befehl scheint nicht ausgeführt zu werden. Wenn ich shell = True setze, hängt die Kommunikation den Thread. Dann, nachdem ich den Python gestoppt habe, habe ich einen nicht mehr existierenden ssh-Prozess. – noahd