Seite 1 von 1

Funktion bei jedem Beenden / Verlassen eines Moduls aufrufen

Verfasst: Sonntag 24. November 2013, 17:34
von mcdwerner
Hi,

ich steh grad vor folgendem Problem:
aus einem anderem Programm wird per System-Call ein Python Modul aufgerufen, es gibt einen globalen Kommandozeilen-Aufruf: log "Info x; y", mit dem Informationen in ein Log-File geschrieben werden. Aufgrund der eingeschränkten Kommunikations-Möglichkeiten des dortigen System-Calls würde ich gerne vor jedem Ende des Python Skripts mit subprocess log "datei xy erfolgreich erstellt" aufrufen, wichtig ist in diesem Fall natürlich, dass der der Aufruf auch (oder gerade) im Fall einer Python-Exception gemacht wird, idealerweise dann natürlich mich dem Stack-Trace.
Ich könnte mir vorstellen, dass es für dieses Problem einen relativ einfachen Lösungsweg gibt, ich nur nicht weiss, wo ich suchen soll. Kann mir jemand auf die Sprünge helfen?

Besten Dank schon mal

Re: Funktion bei jedem Beenden / Verlassen eines Moduls aufr

Verfasst: Sonntag 24. November 2013, 17:46
von cofi
Wenn das "Modul" per Syscall aufgerufen wird, dann ist es doch sehr wahrscheinlich kein Modul sondern ein Programm?

Sollte das tatsaechlich der Fall ist, kannst du das bekannte "ifmain" Idiom benutzen oder das atexit Modul.

Wenn nicht, erzaehle ein wenig mehr ueber die konkreten Aufrufmechnismen.

Re: Funktion bei jedem Beenden / Verlassen eines Moduls aufr

Verfasst: Sonntag 24. November 2013, 17:48
von snafu
Klingt mir nach einem Fall für atexit. Mittels ``atexit.register()`` kannst du festlegen, dass kurz vor Beenden des Interpreters noch die an `register` übergebene Funktion aufgerufen wird. In deinem Fall wäre das dann der Code zum Schreiben der Log-Message.

EDIT: Es geht sogar auch mittels Decorator. Zitat aus der Doku:

Code: Alles auswählen

import atexit

@atexit.register
def goodbye():
    print "You are now leaving the Python sector."

Re: Funktion bei jedem Beenden / Verlassen eines Moduls aufr

Verfasst: Sonntag 24. November 2013, 18:01
von Sirius3
Wenn das ganze auch noch Exceptions loggen soll, dann passt das doch ganz gut ein ein if-main:

Code: Alles auswählen

if __name__=='__main__':
    try:
        logging.info('Programm gestartet')
        main()
    except Exception:
        logging.exception('es ist ein Fehler aufgetreten')
    finally:
        logging.info('Programm beendet')

Re: Funktion bei jedem Beenden / Verlassen eines Moduls aufr

Verfasst: Sonntag 24. November 2013, 18:08
von mcdwerner
@Cofi & Snafu:
atexit sieht sehr vielversprechend für den Normalfall aus, muss mal testen, was bei einer Exception passiert.


@Cofi:
ja, es ist ein Programm, das (bis jetzt) aus nur einem Modul besteht.
"ifmain" verwende ich dort bereits.


@Sirius:
hab ich im except-Zweig irgendwie den Stacktrace zur Verfügung?, das wäre dann die ultimative Lösung :-)
Das ist wohl einer der ganz wenigen Fälle, wo es Sinn macht, alle Exceptions abzufangen

Edit: wer suchet der findet:
traceback.format_exc([limit])
http://docs.python.org/2/library/traceback.html

Re: Funktion bei jedem Beenden / Verlassen eines Moduls aufr

Verfasst: Sonntag 24. November 2013, 19:25
von BlackJack
@mcdwerner: `logging.exception()` gibt auch die Ausnahmeinformationen aus. Nicht das Du Dir hier Arbeit umsonst machst.

Re: Funktion bei jedem Beenden / Verlassen eines Moduls aufr

Verfasst: Montag 25. November 2013, 11:17
von mcdwerner
@BlackJack:
Danke! Muss mal sehen, was mehr Arbeit macht, logging zu importieren + implementieren oder einfach den subprocess call machen
(Das Skript hat im Moment inkl. argparser 160 Zeilen und wird auch nicht mehr wachsen ;-)