2017-04-01 3 views
0

Ich habe ein Python-Skript, das einmal pro Minute läuft. Zum Debuggen möchte ich Textdateien mit Fehlern/Ausnahmen erstellen, falls sie auftreten. Falls Fehler fehlen, möchte ich keine Log-Dateien.Wie speichere ich Python-Fehler (stderr) nur dann in eine Protokolldatei, wenn tatsächlich Fehler auftreten?

BEARBEITEN: Ich kann nicht alle meinen Code in eine try/except-Schleife wickeln, so this hilft nicht.

Zuerst habe ich stderr speichere tun, um .txt:

sys.stderr = open('ERRORS_%s.txt' % (infile), 'a') 
with open("%s_Error_Messages.txt" % (MSKSN), "a") as myfile: 
    myfile.close() 

Zweitens versuche ich dann leer "%s_Error_Messages.txt" % (MSKSN) Dateien vor allen raise SystemExit Positionen zu löschen, da kein Fehler (sonst angehoben wurde, die raise SystemExit Position würde nicht wurden erreicht).

if os.path.getsize('ERRORS_%s.txt' % (infile)) == 0: 
    os.remove('ERRORS_%s.txt' % (infile)) 

Was ich bekomme ist WindowsError: [Error 32] The process cannot access the file because it is being used by another process. Ich gehe davon aus, dass stderr immer von python.exe verwendet wird, solange das Skript ausgeführt wird.

Für den ersten Schritt, ich habe auch versucht:

if sys.stderr != 0: 
    sys.stderr = open('ERRORS_%s.txt' % (infile), 'a') 

die seit sys.stderr nicht funktioniert ist nie 0.

Wie sys.stderr schreiben nur für den Fall, .txt von tatsächliche Fehler?

+0

Vielleicht können Sie das Modul verwenden 'logging' Sie Fehlermeldungen sammeln helfen – xiaoyi

Antwort

1

Sofern Sie eine riesige Menge von Fehlerdaten zu befürchten haben, können Sie einfach stderr in ein Objekt StringIO umleiten und dann schreiben (oder auch nicht), je nach Inhalt

import StringIO 
import sys 

sys.stderr = StringIO.StringIO() 
# do stuff 
if sys.stderr.getvalue(): 
    with open ("path/to/log.txt") as output: 
     output.write(sys.stderr.getvalue()) 

Dies ist ein großer Fall für einen Kontextmanager, der den Ersatz-stderr setzt, führen Sie Ihren Code aus und setzen Sie stderr zurück zu sys.__stderr__, wenn Sie fertig sind.

Wenn Sie nicht den Code in einem Try wickeln, können Sie auch diese Funktionalität könnten versuchen, Einstellung mit sys.excepthook

+0

Ich kann das nicht bekommen Arbeit. Unter #do stuff # gebe ich etwas wie 'print (3/0)' ein, das einen Fehler ausgeben sollte, aber keine Textdatei wird erstellt - was bedeutet, dass der Fehler nicht bei sys.stderr registriert wurde. – Moondra

Verwandte Themen