Newbie-Frage: Trace-Infos innerhalb eines Scripts

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.
Antworten
leoel
User
Beiträge: 36
Registriert: Dienstag 25. Mai 2004, 08:54
Wohnort: Graz

Hallo! Bin gerade dabei von PHP auf Python umzusteigen.... Jetzt bin ich auf der Suche nach einem ähnlichen Construct wie in C++ oder eben PHP, mit dem ich mir in einem Script folgende Infos ausgeben kann:
> aktuelle Zeilennummer, in PHP mit "__line__"
> aktuelles File, in PHP mit "__file__"
> aktuelle Funktion, in PHP mit "__function__"
> aktuellle Klasse, in PHP mit "__class__"
> aktuelle MEthode, in PHP mit "__method__"

Für Python habe ich nur __class__ und __dict__ (alle Member der Instanz) gefunden.

Gibt es für "File" und "Line" Möglichkeiten, das herauszufinden?
Danke,
Leo
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

leoel hat geschrieben:Gibt es für "File" und "Line" Möglichkeiten, das herauszufinden?
Hallo Leo!

Ich habe mal ein wenig experimentiert und dieser (noch nicht ausgereifte) Code ist dabei herausgekommen:

Code: Alles auswählen

def name_des_startmoduls():
    """Gibt den Namen des vom Benutzer gestarteten Moduls zurueck."""
    from sys import argv
    return argv[0] 

try:
    print name_des_startmoduls_falschername()

except Exception, data:
    import traceback, sys
    tb = traceback.format_tb(sys.exc_traceback)
    print "-"*80
    print "Fehler:         %s" % data
    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
Als Ergebnis kommt unter Windows folgendes raus:

Code: Alles auswählen

--------------------------------------------------------------------------------
Fehler:         name 'name_des_startmoduls_falschername' is not defined
Startmodul:     C:\Dokumente und Einstellungen\Gerold\Desktop\Script1.py
Zeilennummer:   7
Dateiname:      C:\Dokumente und Einstellungen\Gerold\Desktop\Script1.py
--------------------------------------------------------------------------------
Vieleicht hilft es dir ja weiter...

mfg
Gerold
:-)

Edit: Code in Python-Tags gesetzt und die Variable "inst" durch "data" ausgetauscht.
Zuletzt geändert von gerold am Montag 22. Mai 2006, 15:11, insgesamt 1-mal geändert.
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
leoel
User
Beiträge: 36
Registriert: Dienstag 25. Mai 2004, 08:54
Wohnort: Graz

Hallo Gerold!

Danke, ich habs inzwischen auch mit Traceback gemacht,
aber dein Zeug hilft noch ein bisschen weiter.

Dankeschön, Leo
Gast

Ich danke euch alle! Nach eurer Vorschlägen bin ich bei unittest.py abgeschaut und ich kann mit traceback viel abfragen :D

Boostpy
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Wenn du aus der PHP Ecke kommst und was für's Web machst, dann füge als erstes in dein Skript folgendes ein:

Code: Alles auswählen

import cgitb;cgitb.enable()
Das "aktiviert" eine art HTML-Traceback, sodas du besser sehen kannst, was schief gelaufen ist. Natürlich muß vorher der Content-type-Header gesendet worden sein...

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
einGast

Hallo,
leoel hat geschrieben:> aktuelle Funktion, in PHP mit "__function__"
Dazu habe ich leider noch nichts gefunden (oder ich bin einfach nur blind ;-))... Gibt es hierfür auch eine Möglichkeit in Python? Fände ich in manchen Situationen ganz nützlich :-)

Danke schon mal für ein paar Tipps!

MfG,
einGast
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

einGast hat geschrieben:
leoel hat geschrieben:> aktuelle Funktion, in PHP mit "__function__"
Dazu habe ich leider noch nichts gefunden (oder ich bin einfach nur blind ;-))... Gibt es hierfür auch eine Möglichkeit in Python? Fände ich in manchen Situationen ganz nützlich :-)
Klar gibts das, ist allerdings etwas versteckt, da es selten gebraucht wird:

Code: Alles auswählen

#!/usr/bin/env python
# -*- encoding: latin-1 -*- 
import sys

def detect_name():
    frame = sys._getframe()
    print frame.f_code.co_name
    
if __name__ == '__main__':
    detect_name()
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten