Seite 1 von 1

Output umleiten

Verfasst: Montag 9. März 2009, 12:40
von edwood
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?

Re: Output umleiten

Verfasst: Montag 9. März 2009, 12:51
von gerold
Hallo edwood!

Willkommen im Python-Forum!

Code: Alles auswählen

stderr = subprocess.STDOUT
mfg
Gerold
:-)

Verfasst: Montag 9. März 2009, 12:55
von 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.

Verfasst: Montag 9. März 2009, 16:40
von gerold
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
:-)

Verfasst: Freitag 27. März 2009, 14:00
von edwood
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?

Verfasst: Freitag 27. März 2009, 14:02
von DasIch
@edwood Du solltest dir dringend mal PEP 8 ansehen.

Verfasst: Freitag 27. März 2009, 15:16
von edwood
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)

Verfasst: Freitag 27. März 2009, 20:34
von 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.

Verfasst: Sonntag 29. März 2009, 19:06
von edwood
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)