Seite 1 von 1
subprocess: Output und Error-Code verarbeiten
Verfasst: Donnerstag 5. Juni 2014, 16:37
von graceflotte
Moin,
ich habe folgenes Problem:
Aktuell schreibe ich den Output aller Kanäle von
ls in eine Datei, um Sie später wieder zu lesen.
Code: Alles auswählen
subLs = subprocess.Popen("ls > /tmp/lsOutput 2>&1",shell=True)
errCode = subLs.wait()
Da mir das aber recht unschön erschien habe ich es nun anders gelöst:
Das Ganze hat jetzt nur halt den Haken, dass ich nicht weiß, wie ich an den Error-Code komme, da lsOutput ja ein String ist und kein Objekt. Habt ihr da eine Idee? Danke

Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Donnerstag 5. Juni 2014, 17:02
von BlackJack
@graceflotte: Das geht mit `check_output()` nicht. Das Unchöne an der ersten Lösung ist IMHO das Du eine Shell dazwischen schaltest um die Ausgaben umzuleiten, und dann auch noch in eine Datei, statt das über das `Popen`-Objekt zu machen und die Ausgaben zu PIPEn. Also ungetestet:
Code: Alles auswählen
from subprocess import PIPE, Popen, STDOUT
# ...
process = Popen(['ls'], stdout=PIPE, stderr=STDOUT)
output, _ = process.communicate()
error_code = process.wait()
Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Donnerstag 5. Juni 2014, 17:51
von graceflotte
ok, danke
Was hat es mit dem Unterschrich in Zeile 5 auf sich?
Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Donnerstag 5. Juni 2014, 18:01
von Schorlem
@graceflotte Da Popen.communicate() zwei Werte (stdoutdata, stderrdata) zurückgibt und der zweite nicht gebraucht wird, nimmt man meist den Unterstrich statt eines "normalen" Variablennamens, wenn man den Rückgabewert nicht weiter verwenden will.
Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Donnerstag 5. Juni 2014, 18:56
von pillmuncher
@graceflotte: Was Schorlem gesagt hat. Ergänzend dazu: der Unterstrich ist für den Programmierer da, nicht für Python. Für Python ist er ein ganz normaler Name, aber dem Programmierer zeigt er an, was Schorlem erläutert hat.
Nur am Python-Prompt bedeutet er etwas anderes:
D.i. der Wert des zuletzt ausgewerteten Ausdrucks.
Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Donnerstag 5. Juni 2014, 19:53
von graceflotte
Ah, ok. Vielen Dank
Nur aus neugier: Wie sieht soeine Funktion mit mehreren Return-Werten aus?
Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Donnerstag 5. Juni 2014, 20:00
von EyDu
Jede Funktion hat genau einen Rückgabewert, dieser kann jedoch beliebig komplex sein.
gibt genau einen Wert zurück, nämlich das Tupel (23, 42). Der Trick mit dem ``output, _ = process.communicate()`` nennt sich Tuple-Unpacking. Damit kannst du ein Tupel in seine Bestandteile zerlegen:
Das ist einfach kurz für
Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Freitag 6. Juni 2014, 12:03
von graceflotte
@EyDu
Und wieder was gelernt. Danke
Noch eine letzte Frage:
PIPE gibt an, dass der Output nicht ausgegeben werden soll?
BlackJack hat geschrieben:@graceflotte: Das geht mit `check_output()` nicht. Das Unchöne an der ersten Lösung ist IMHO das Du eine Shell dazwischen schaltest um die Ausgaben umzuleiten, und dann auch noch in eine Datei, statt das über das `Popen`-Objekt zu machen und die Ausgaben zu PIPEn. Also ungetestet:
Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Freitag 6. Juni 2014, 12:12
von BlackJack
@graceflotte: ``stdout=PIPE`` gibt an wo die Standardausgabe von dem externen Prozess hingeschrieben werden soll. In diesem Fall in eine „pipe” die mit dem aufrufenden Prozess verbunden ist und auf dem `Popen()`-Objekt als Dateiobjekt als Attribut `stdout` verfügbar ist. Da kann man die Ausgabe dann auslesen. Was `communicate()` intern für einen erledigt. Man hätte an der Stelle auch ``process.stdout.read()`` verwenden können.
Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Dienstag 10. Juni 2014, 17:36
von graceflotte
Vielen Dank.
Wie verwirkliche ich Befehle mit Pipe?
also z.B.
Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Dienstag 10. Juni 2014, 18:38
von BlackJack
@graceflotte: Zwei `Popen`-Prozesse starten und dabei die Ausgabe von einem mit der Eingabe des anderen verbinden. Wobei man auch immer schauen sollte ob man die externen Programme überhaupt braucht. Das war wahrscheinlich nur ein Beispiel, aber *das* würde man sicher besser in Python schreiben statt externe Programme zu starten.
Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Dienstag 10. Juni 2014, 18:54
von graceflotte
Wie würde man das dann in Python umsetzten?
Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Dienstag 10. Juni 2014, 19:12
von EyDu
Ein erster Anfang ist immer der Blick in die Dokumentation des entsprechenden Moduls. Angeblich enthält die Dokumentation sogar ein Beispiel zu genau diesem Thema. Habe ich mal so gehört

Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Dienstag 10. Juni 2014, 19:43
von BlackJack
Code: Alles auswählen
from __future__ import print_function
import os
def main():
for filename in os.listdir(os.curdir):
if 'loop' in filename:
print(filename)
if __name__ == '__main__':
main()
Oder habe ich die Frage jetzt falsch verstanden?

Re: subprocess: Output und Error-Code verarbeiten
Verfasst: Dienstag 10. Juni 2014, 19:55
von graceflotte
Ne, passt schon. Danke
