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
Funktion bei jedem Beenden / Verlassen eines Moduls aufrufen
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
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.
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.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
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:
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."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')@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
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
-
BlackJack
@mcdwerner: `logging.exception()` gibt auch die Ausnahmeinformationen aus. Nicht das Du Dir hier Arbeit umsonst machst.
@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
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
