umleitung der fehlerausgabe

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Gast

hallo zusammen

ich habe meine cgi skripten immer in einem try, except block, um fehler auswerten zu können, da ich ja bei meinem webprovider den errorlog nicht einsehen kann. das ist sehr nützlich wenn ich vergessen habe z.b. einen pfad anzupassen, der auf meinem lokalen server anders lautet. nun werden aber nicht alle fehler umgeleitet. syntax error kann ich trotz folgenden code nicht einsehen:



allerlei übliches wie interpreter

einige imports

dann...

Code: Alles auswählen

try:

   print "irgendwas"

except:
    pfad='/var/www/html/crossover/'
    dateiname='fehler.txt'
    text=pfad+dateiname
    sys.stderr=open(text, 'a')
    print traceback.print_exc(sys.exc_info()[2])
    sys.stderr.close()


was muss ich im exceptblock ändern, dass alle fehler dort hingeschrieben werden?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi rolgal,

eigentlich sollte es genügen, in einem deiner Module sys.stderr auf eine Datei umzuleiten (als Textdatei zu öffnen), statt alles mit try:...except: abzufangen.


Gruß

Dookie
Gast

hi dookie!

wie meinst du das jetzt?

ich habe in webtools eine funktion geschrieben, die den code vom except block enthält.

also eigentlich steht dann bei except, weil alles von webtools importiert wird fehlerschreiben()

aber um den try, except block kann ich doch nicht umherkommen, oder?

:?:

mfg

rolgal
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

hmm mir gefällt es nicht, wenn alle exceptions abgefangen werden, im Fehlerfall läuft dann das script weiter mit unter umständen fatalen folgen.
Um die Fehlermeldungen und Warnungen von Python mitzuprotikollieren, genügt ein
sys.stderr = file("pfad_zum/fehlerlog.txt","a",0)
ohne es gleich zu schließen.


Gruß

Dookie
Gast

hi dookie!

stimmt natürlich wieder mal , was du schreibst.

nur, ist es nicht problematisch die datei nicht zu schliessen?

und was kann ich tun, dass auch ein syntaxerror in diese datei geschrieben wird?

danke für deine hilfe!

mfg

rolgal
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

in dem Fall ists nicht problematisch die Datei nicht zu schließen, erstens wird sie mit dem 3. Parameter "0" ungepuffert geöffnet, also die Ausgabe wird gleich in die Datei geschrieben, und 2. wird die Datei beim Beenden des scripts sowieso geschlossen.

Um auch die Syntaxfehler in die Datei umzuleiten, musst Du, beim Starten des Scripts, die Fehlerausgabe des Interpreters schon in die Datei umleiten. Unter Linux/Unix mit
python script.py 2>> /var/www/html/crossover/fehler.txt
Es sollte auch gehen, wenn Du als erste Zeile im Script

Code: Alles auswählen

#!/usr/bin/env python 2>> /var/www/html/crossover/fehler.txt
verwendest.


Gruß

Dookie
Gast

hm :?

ich kann wieder mal nur bedingt folgen. heisst das, dass das script das als modul importiert wird so aussehen müsste?

Code: Alles auswählen

#!/usr/local/bin/env python 2>> /var/www/html/crossover/fehler.txt
#!/usr/local/bin/python

import sys, traceback, smtplib, cgi, re

sys.stderr = file("/var/www/html/crossover/fehler.txt","a",0) 


def mailsenden(empfaenger,absender,betreff,nachricht):
    msg="To: %s\n" %empfaenger
    msg=msg+"From: %s\n" %absender
    msg=msg+"Subject: %s\n\n" %betreff
    msg=msg+str(nachricht)
    server=smtplib.SMTP('localhost')
    server.sendmail(absender, empfaenger, msg)
    server.close()
ich habe local eingefügt weil ja der interpreter auch dort ist.
leider funktioniert es nicht, aber vielleicht habe ich dich falsch verstanden, deshalb poste ich das modul mal.

danke dir.

mfg

rolgal
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Was du mittels der Umleitung von sys.stderr gebastelt hast ist bestimmt auch funktionstauglich und gut, aber ich würde es nicht verwenden: es geht wieder mal einfacher, weil Python die Mittel onBoard hat. Mach mal am Scriptanfang einfach das:

Code: Alles auswählen

import cgitb
cgitb.enable()
Nun werden Fehler im Browser angezeigt, als ob du in der Shell arbeitest. Falls das unerwünscht ist, kannst du das ganze auf in Dateien mitloggen lassen, ganz wie du willst (und auch da wahlweise in HTML oder plain Text; weitere Funktionen von cgitb sind hier)

Code: Alles auswählen

cgitb.enable(0,'.')
Syntaxfehler können auf diese Weise niemals abgefangen werden, aber man kann das Script vor dem hochladen auf den Server ja mal in der Shell ausführen und da werden gleich am Anfang, falls vorhanden, die Syntaxfehler angezeigt.

mfg. Milan
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Dookie hat geschrieben:Um auch die Syntaxfehler in die Datei umzuleiten, musst Du, beim Starten des Scripts, die Fehlerausgabe des Interpreters schon in die Datei umleiten. Unter Linux/Unix mit
python script.py 2>> /var/www/html/crossover/fehler.txt
Es sollte auch gehen, wenn Du als erste Zeile im Script

Code: Alles auswählen

#!/usr/bin/env python 2>> /var/www/html/crossover/fehler.txt
verwendest.
So, ich hab mir den Rest jetzt mal zu gemüte geführt, vorher nur überflogen... Ist es überhaupt möglich, bei cgi-Scripten eine Umleitung von Anfang an zu machen? Und wenn ja, ist das nicht extrem problematisch, da ja eigentlich die Ausgaben an den Apache und nicht an eine Datei geleitet werden sollen, oder? Von daher hätte ich so meine Bedenken bei der Sache. Bei Shellscripten sicher kein Problem, bei cgi-Scripten doch schon eher.

Milan
Gast

hi milan!

ja klar das mit cgitb.enable() geht natürlich auch, habe ich aber weggetan, weil mein provider noch ne pythonversion hatte, die das nicht unterstützt hat. inzwischen hat er, wie ich woanders schon erwähnte, ein update gemacht. mein hirn ist da natürlich nicht gleich auf die idee gekommen die sache wieder über cgitb.enable zu machen.

es funktioniert so und so, aber ich will eben auch die syntaxfehler, also einfach alle fehler haben, wenn es denn realisierbar ist.

danke, dass du mich an die möglichkeit erinnert hast!


mfg

rolgal
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi. Wie gesagt, das mit den Syntaxerror wird sehr schwer, denn wenn ein solcher existiert, wird dein Script gar nicht erst ausgeführt, sondern gleich deswegen beendet. Da kann auch keine Umleitung erfolgen, wenn ie nicht von Anfang an besteht. Das halte ich jedoch für problematisch, wenn man nicht explizit nur den Fehlerkanal statt allen (also nur sys.stderr statt sys.stdout und sys.stderr) umleiten kann. Ich halte das für nicht realisierbar.
rogal hat geschrieben:ja klar das mit cgitb.enable() geht natürlich auch, habe ich aber weggetan, weil mein provider noch ne pythonversion hatte, die das nicht unterstützt hat.
Versteh ich ehrlich gesagt nicht... die Module die cgitb verwendet dürften in allen Pythonversionen vorhanden sein, daher kann man doch einfach von einer neueren Version die cgitb.py in sein cgi-bin Verzeichniss tun. So kann man die dann doch auch benutzen, oder? Ich habs jedenfalls bei ähnlichen Fällen immer so gehandhabt...

Milan
Gast

hallo milan!
Versteh ich ehrlich gesagt nicht... die Module die cgitb verwendet dürften in allen Pythonversionen vorhanden sein, daher kann man doch einfach von einer neueren Version die cgitb.py in sein cgi-bin Verzeichniss tun.
ja, soweit habe ich nicht gedacht, ich habe gesehen, dass mein provider pyhton 2.1.0 hatte und da ist dieses programm standardmäßig noch nicht dabei!

Ich werde wohl meine grundsätzliche herangehensweise bei der lösung eines problems überdenken müssen.

:D

was den syntaxerror angeht: wichtig wäre er mir nur deshalb, wenn ich ein skript online editiere. wenn ich einen murks baue, dann wird es schwer ihn zu finden.

mfg
rolgal
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hallo nochmal.

also das mit dem Umleiten des Fehlerkanals in eine Datei funktioniert nur beim direkten Start eines Scripts, nicht erst wenn ein Modul importiert wird. Also das Script, dessen URI Du im Browser eintippst, dessen Fehlerkanal sollte sich auf die von mir beschriebene art und weise umleiten lassen.

@Milan: sys.stdout wird an den Apache geschickt um an den Browser gesendet zu werden, sys.stderr anscheinend nicht, sonst würde rolgal ja Fehlermeldungen im Browser angezeigt bekommen, auch Syntaxfehler.


Gruß

Dookie
Gast

hi dookie!

aber wie soll ich das beim start des scripts machen? das script wird ja über action="../cgi-bn/script.py" aufgerufen.

ich sitze sicher wieder mal :(

mfg

rolgal
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

falls Du an das script.py herankommst, kannst Du da versuchen die Umleitung, wie von mir beschrieben, in der ersten zeile anzugeben. Oder, wenn möglich, das script über action="../cgi-bn/script.py 2>>/var/www/html/crossover/fehler.txt" starten lassen.


Gruß

Dookie
Gast

danke!

ich werde mal alles in ruhe jetzt ausprobieren. die angabe in der ersten zeile hat eben leider zu keinem ergebnis probiert.

das in form action zu inkludieren wird gleichmal getestet.

mfg

rolgal
Gast

@dookie

also ich habe es auf beide arten probiert und es geht leider nicht.

dass es mit form action nicht geht ist eigentlich logisch. er sagt natürlich file not found.

trotzdem danke nochmal

mfg

rolgal
Gast

@milan

na das cgitb.enable() liegert ja eh alles was ich will :wink:

auch syntaxerror :lol:


mfg

rolgal
Gast

@milan

um die verwirrung perfekt zu machen,

nicht jeden syntax error :?: :shock:

warum auch immer

mfg

rolgal
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Wahrscheinlich wird er SyntaxError im Script, in dem du cgitb aktivierst nicht finden, dafür aber schon eher in deinen Modulen die du importierst. Das liegt aber auch auf der Hand, da beim 1. Fall das script gar nicht erst ausgeführt wird und keine Fehlermeldung erstellt werden kann und im 2. cgitb aber schon aktiv ist... Da musst du halt mit leben, oder falls du alle Fehler haben willst: erst von einem außenstehenden Script das Hauptscript auf Syntaxfehler prüfen lassen und dann dein Hauptscript laufen lassen. Umständlich, aber machbar.

Milan
Antworten