stderr Ausgabe umleiten und...

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.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

stderr Ausgabe umleiten und...

Beitragvon DatenMetzgerX » Freitag 20. Oktober 2006, 19:22

Hallo

Habe folgendes Problem...
Ich begann mit logging in meinem Programm Logs hinzuzufügen. Nun hätte ich allerdings gerne, das auch stderr umgeleitet wird, in das Logfile schreibt.

Bis anhin keine grosse Sache, nun aber zu meinem Problem...
Wenn ein Traceback ausgegeben wurde (nur dann wird stderr verwendet), hätte ich gerne die ganze traceback meldung in eienr liste zusammengeknäult ;), damit ich ein kleines Fenster öffnen kann, womit der Benutzer mir dann den Traceback und ggf. eine Fehlermeldung senden kann.

Ist das irgend wie möglich?
Greeze DM
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: stderr Ausgabe umleiten und...

Beitragvon gerold » Freitag 20. Oktober 2006, 21:12

DatenMetzgerX hat geschrieben:hätte ich gerne die ganze traceback meldung in eienr liste zusammengeknäult

Hi DM!

Vielleicht kannst du da etwas für dich raus holen:

Code: Alles auswählen

#!/usr/bin/env python -O
# -*- coding: iso-8859-1 -*-

try:
    f = file("mich_gibt_es_nicht.txt")
except Exception, inst:
    import traceback, sys
    tb = traceback.format_tb(sys.exc_traceback)
    print "-"*80
    print "Fehler:         %s" % inst
    print "Startmodul:     %s" % sys.argv[0].strip()
    print "Zeilennummer:   %s" % traceback.tb_lineno(sys.exc_traceback)
    print "Dateiname:      %s" % tb[0].split(",")[0].strip()[6:-1]
    print "-"*80

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Beitragvon DatenMetzgerX » Freitag 20. Oktober 2006, 22:12

So kurz getestet scheint es zu funktionieren, allerdings sind die tracebacks von python ein wenig ausführlicher :roll: (Vorallem der Verlauf des Programmes wäre nice :) )

Zusätzlich habe ich noch folgendes Problem ...

Wie kann ich ein Try ... except um meine ganze wxpython anwendung legen...

Code: Alles auswählen

    sys.stdout = output.stdout()
    sys.sterr = output.stderr()
    try:
        app = wx.PySimpleApp(False)
        frame = MainFrame(None)
        frame.Show()
        app.SetTopWindow(frame)
        app.MainLoop()
    except Exception, ex:
        sys.stderr.write(None, ex)


Er fängt die Exception nicht ab :roll:
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Beitragvon DatenMetzgerX » Samstag 21. Oktober 2006, 11:57

Hier meine Lösung...

Code: Alles auswählen

#!/usr/bin/env python
#-*- coding: utf-8 -*-

import data
import os
import logging
       
class logger(object):
    log = None
    @staticmethod
    def getInstance():
        if logger.log is None:
            logger.log = logging
            logger.log.basicConfig(level = logging.DEBUG,
                              format='%(asctime)s %(levelname)s: %(message)s',
                              filename = os.path.join(data.PATH, 'logfile.log'),
                              filemode='w')
            msg = os.linesep * 2 +  30*'-' + os.linesep + "Logger wurde gestartet" + os.linesep+ 30 *'-' + os.linesep * 2
            logger.log.info(msg)
        return logger.log
   
class stdout(object):
    def __init__(self):
        self.__log = logger.getInstance()
   
    def write(self, t):
        if not t == '\n' and t:
            self.__log.info(t)
           
class stderr(object):
    def __init__(self):
        self.__log = logger.getInstance()
       
    def write(self, ex):
        self.__log.exception(ex)
       
    def stdout(self, t):
        self.write(t)
       
if __name__ == '__main__':
        try:
            import sys
            sys.stdout = stdout()
            sys.stderr = stderr()
            print 'INFOS'
            sys.stderr.write('uiii')
            k.kw()
        except Exception, ex:
            sys.stderr.write(ex)
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Beitragvon DatenMetzgerX » Sonntag 22. Oktober 2006, 19:17

Es geht leider doch noch nicht ganz :(

alle FEhler die nach dem app.MainLoop() auftregen fänt mein try: ... except nicht ab. Wüsste noch jemand, was ich machen könnte?
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Beitragvon Jan-Peer » Sonntag 27. April 2008, 07:16

Hallo,

ich sitze gerade an einer vergleichbaren Problematik. Hast du damals noch eine befriedigende Lösung für das Logging aus der MainLoop gefunden?
Benutzeravatar
DatenMetzgerX
User
Beiträge: 398
Registriert: Freitag 28. April 2006, 06:28
Wohnort: Zürich Seebach (CH)

Beitragvon DatenMetzgerX » Sonntag 27. April 2008, 14:28

Ich kann dir nicht sagen, ob es nun wierklich funktioniert... habe das Projekt irgend wann stillgelegt...

http://paste.pocoo.org/show/44339/

output.py regeld das Exception handling... das onerror ist ein Fenster, dass im Falle eines Fehlers angezeigt wird -> Bei fehler vor dem initialisieren der App knallt es, denn die App muss ja zuerst initialisiert sein.

Es ist sicherlich noch überarbeitungs fähig, auch könnte man den Programmierstiel noch verbessern, jedoch funktioniert es im gross und ganzem...

Ich hoffe, dass es dir hilft!
Jan-Peer
User
Beiträge: 166
Registriert: Dienstag 2. Oktober 2007, 10:55

Beitragvon Jan-Peer » Sonntag 27. April 2008, 16:22

Ja, vielen Dank!

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]