Nehmen Sie diesen Code als Beispiel (tar durch -z -J -j komprimieren kann, und es gibt ein tarfile spezifisches Modul, ich weiß, aber es ist eine lange laufenden Prozess darstellen)Wie kann ich überprüfen, ob einer von zwei Piped Subprozess in Python fehlschlägt?
from subprocess import Popen, PIPE
with open('tarball.tar.gz', 'w+') as tarball:
tarcmd = Popen(['tar', '-cvf', '-', '/home'], stdout=PIPE)
zipcmd = Popen(['gzip', '-c'], stdin=tarcmd.stdout, stdout=tarball)
tarcmd.stdout.close()
zipcmd.communicate()
# added a while loop that breaks when tarcmd gets a
# proper return value. Can it be considerate a good
# solution?
while tarcmd.poll() is None:
print('waiting...')
# test the values and do stuff accordingly
Dies ist die typische Beispiel für die Übergabe von zwei Befehlen im Python-Subprozess. Jetzt ist es einfach, den Rückgabecode von zipcmd zu überprüfen, aber wie kann man überprüfen, ob tarcmd fehlschlägt? wenn ich seinen Returncode überprüfe, bekomme ich immer keinen (ich denke, weil stdout geschlossen ist). Grundsätzlich möchte ich eine Ausnahme auslösen, wenn einer der beiden Befehle fehlschlägt. In bash gibt es $ PIPESTATUS, wie kann ich das in Python machen?
Von Dokumentation des Subprozess-Modul, über Prozesse Rückkehr Überprüfung: A Kein Wert zeigt an, dass der Prozess noch nicht beendet hat. Ihr tarcmd wird noch ausgeführt ODER Sie haben das Ergebnis nicht überprüft. Warten Sie, bis es mit .wait() oder .poll() beendet wird. Mit diesen Methoden wird der korrekte Rückgabewert festgelegt. – Maciek
Danke, ich habe eine While-Schleife hinzugefügt, die bricht, wenn tarcmd einen passenden Returncode bekommt und es scheint jetzt zu funktionieren! (Es kann eine gute Lösung sein?). Ich habe auch versucht, tarcmd.communicate(), aber es funktioniert nicht. Wenn ich es nach tar.stdout.close() setze, ob der Befehl fehlschlägt oder es gelingt, bekomme ich immer einen "ValueError: I/O-Vorgang bei geschlossener Datei". Wenn ich es vor tar.stdout.close() lege, da communicate() wartet, bis der Befehl beendet ist, wird stdout nicht geschlossen und erlaubt dem tarcmd nicht, ein sigpipe zu erhalten, wenn gzip vorzeitig beendet wird. Jede weitere Hilfe wird geschätzt – Egidiux