Output umleiten

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
edwood
User
Beiträge: 8
Registriert: Montag 9. März 2009, 11:55

hi,
ich will den output eines beliebigen commandos mitloggen, d.h. ich will den output dann in 2 files stehen haben.
stdout+stderr => cmd.log
stderr => cmd.err

das problem ist jetzt dass stdout UND stderr in ein file müssen, habs bis jetzt so dass im .log-file eben NUR stdout steht, ohne stderr:

Code: Alles auswählen

import subprocess as sp
def logger(cmd, logfile):
   fo = open(logfile+".log", "w")
   fe = open(logfile+".err", "w")
   
   proc=sp.Popen(cmd, stdout=fo, stderr=fe)

logger("mycmd", "fileoutput")

also geht das irgendwie dass ich stderr auch noch in fo schreibe?
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Hallo edwood!

Willkommen im Python-Forum!

Code: Alles auswählen

stderr = subprocess.STDOUT
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
BlackJack

@edwood: Da wirst Du wohl selber Code für schreiben müssen, der das explizit tut.

@gerold: Die Ausgaben von `stderr` sollen in *beiden* Dateien landen und nicht nur in die eine umgeleitet werden.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

BlackJack hat geschrieben:@gerold: Die Ausgaben von `stderr` sollen in *beiden* Dateien landen und nicht nur in die eine umgeleitet werden.
Hallo BlackJack!

Das habe ich übersehen.

lg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
edwood
User
Beiträge: 8
Registriert: Montag 9. März 2009, 11:55

ok, ich versuch gerade etwas anderes, und zwar hab ich ein einziges logfile in dem jetzt stderr und stdout stehen soll, aber genau so wie das jeweilige command das ausgibt, das probelm ist nur, dass ich eben schauen will ob ein error aufgetreten ist (indem ich das stderr check) und das signalisieren (return "Failure"). habs jetzt mal so, dass das zwar funktioniert aber nur so, dass im logfile zuerst der komplette stdout steht und am ende der komplette stderr (und nicht gemischt wie es eigentlich sein sollte)

Code: Alles auswählen

def checkError(proc):
    errors = 0
    for line in proc.stdout:
      logfile.write (line)
    for line in proc.stderr:
      logfile.write (line)
      errors = errors+1

    if errors > 0:
      return "Failed"
    else:
      return "Ok"

cmd = "make"
proc=subprocess.Popen(cmd.split(), stderr=subprocess.PIPE, stdout=subprocess.PIPE)
res = checkError(proc)
kann man also stdout+stderr 1:1 in ein logfile schreiben und dann aber noch zusätzlich stderr checken?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

@edwood Du solltest dir dringend mal PEP 8 ansehen.
edwood
User
Beiträge: 8
Registriert: Montag 9. März 2009, 11:55

danke, ist zwar nett gemeint hilft mir aber nur bedingt weiter, denn ich glaube kaum dass mein problem mit dem richtigen einrücken zu beheben ist ;)

(und keine sorge, ich weiß dass es da nicht nur ums einrücken geht, werds mir auch bei gelegenheit genauer anschauen, würde aber gerne zuerst das problem lösen)
BlackJack

@edwood: Du hast da noch ein ganz anderes Problem: Wenn der gestartete Prozess so viel nach `stderr` schreibt, dass der Puffer zwischen den beiden Programmen "voll läuft", dann blockieren sich die Programme gegenseitig und bleiben hängen. Du müsstest die beiden Dateien schon gleichzeitig auslesen, entweder mit Threads oder mit dem `select`-Modul (das unter Windows allerdings nicht mit Dateien funktioniert.
edwood
User
Beiträge: 8
Registriert: Montag 9. März 2009, 11:55

hmm....ok, hört sich natürlich schon mal schlecht an bzw. kompliziert (soll unter linux + win laufen), ich kann aber irgendwie nicht ganz glauben, dass das hier so ungewöhnlich ist was ich machen will, also einfach ein externes programm aufrufen, seinen output speichern und diesen auf fehler überprüfen (und möglichst generisch, also ohne suche nach bestimmten strings wie "error" oder ähnlichem, deswegen eben dieser erste versuch mit stderr)
Antworten