Warning in eine Datei schreiben

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
Stock63
User
Beiträge: 4
Registriert: Donnerstag 18. Januar 2018, 15:50

Donnerstag 18. Januar 2018, 16:07

Guten Tag alle zusammen,

Für meine Bachelorarbeit versuche ich mir ein Kennfeld mit Cantera zu erstellen und nutze Python dafür.
Die Idee ist an sich recht simpel: Ich lasse 4 Schleifen durchlaufen und Cantera berechnet mir für jeden Punkt meine gewollten Parameter aus und am Ende möchte ich mir Machzahl,Strömungsgeschwindigkeit, gamma verbrannt und gamma unverbrannt in eine Datei ausgeben lassen. Soviel zum Background.

Leider kommt es an einigen Punkten dazu, dass ich eine Warnung erhalte. Bsp.:

Warning: Temperature (3517.84 K) outside valid range of 300 K to 3500 K

Diese Warnung führt aber nicht zu einem Abbruch sondern das Programm läuft wie gewollt durch.

Nun zu meiner Frage:
Ich würde gerne die Punkte in dem Kennfeld erkenntlich machen wo diese Fehlermeldungen auftreten. Entweder soll die Fehlermeldung direkt in das Output File mitgeschrieben werden, oder eine Hilfsvariabel mit der ich vorher prüfe ob eine Warnung ausgegeben wurde oder nicht.

Code: Alles auswählen

np.savetxt('test2.csv',(gamma_u, gamma_b, M_cj, D_cj,fehler), delimiter=',')
Leider schaffe ich es nicht irgendwie diesen Fehler zu referenzieren. Also ich dachte daran z.B. nach jedem Punkt noch eine if-Schleife anzubringen in der Art:

Code: Alles auswählen

if warning==True:
    fehler=1
else:
    fehler=0
Wobei natürlich der Befehl "warning" nicht existiert und ich da eben nach einer Möglichkeit suche den Fehler zu referenzieren.

Ich hoffe sehr ich habe mich deutlich genug ausgedrückt :? und es gibt hier jemanden der mir helfen kann. Ich habe schon alles Mögliche an Artikeln/Foren gelesen und konnte leider nirgends was passendes finden. Für jeden Hilfe wäre ich sehr sehr dankbar.

Viele Grüße,
Stock63
__deets__
User
Beiträge: 2668
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 18. Januar 2018, 16:20

if-Schleifen gibt es nicht. http://if-schleife.de/ :wink:

Dein Problem koennte hiermit zu loesen sein:

https://docs.python.org/2/library/warni ... g-warnings
Benutzeravatar
noisefloor
User
Beiträge: 2359
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Donnerstag 18. Januar 2018, 16:22

Hallo,

du kannst `warnings` in eine Excpetion umwandeln, auf die kannst du dann reagieren. Eine Erklärung gibt's z.B. hier: https://pymotw.com/3/warnings/

Habe ich selber aber auch noch nie gemacht bzw. benötigt.

Gruß, noisefloor
__deets__
User
Beiträge: 2668
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 18. Januar 2018, 16:32

@noisefloor: dann bricht seine Berechnung aber ab. Ich bezweifele, dass das gewuenscht ist.
Stock63
User
Beiträge: 4
Registriert: Donnerstag 18. Januar 2018, 15:50

Donnerstag 18. Januar 2018, 16:39

Hey,
erstmal danke für die schnellen Anwtorten @__deets__ & @noisefloor.

Aber leider hatte ich es bereits versucht mit dem warnings package aber leider ohne Erfolg. Auch wenn ich die Warning mit einer exception in einen Error umwandeln kann folgt folgerichtig ein Abbruch vom Programm und wie @__deets__ bereits angemerkt hat ist das nicht gewünscht.

Ich will die Warning ja gar nicht weg bekommen sondern eben nur im Output File erkenntlich machen :?

Viele Grüße,
Stock63
__deets__
User
Beiträge: 2668
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 18. Januar 2018, 16:57

Aber was ich gepostet habe gibt dir diese Moeglichkeit doch. Da wird gezeigt, wie die Exceptions gesammelt werden, und dann kannst du die Verarbeiten. Also auch in eine Datei schreiben.
Benutzeravatar
noisefloor
User
Beiträge: 2359
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: Görgeshausen
Kontaktdaten:

Donnerstag 18. Januar 2018, 19:44

Hallo,

man man eine Exception generiert kann man auch drauf reagieren:

[codebox=pycon file=Unbenannt.txt]>>> import warnings
>>> warnings.simplefilter('error', UserWarning)
>>> warning.warn('be carefull')>>> try:
... warnings.warn('be carefull')
... except UserWarning:
... print('caught warning')
...
caught warning
>>>[/code]

Wobei man dann natürlich wissen muss, welchen Typ Warnung das Programm nutzt... Die Möglichkeit von __deets__ ist mit Context Manager ist aber wohl eleganter.

Gruß, noisefloor
__deets__
User
Beiträge: 2668
Registriert: Mittwoch 14. Oktober 2015, 14:29

Donnerstag 18. Januar 2018, 20:22

@noisefloor: das ist nicht nur eine Frage der Eleganz. Dein Ansatz unterbricht die laufende Berechnung. Meiner sammelt nur Warnungen auf. Da kommt es aber nicht zum Stack unwinding.
Stock63
User
Beiträge: 4
Registriert: Donnerstag 18. Januar 2018, 15:50

Freitag 19. Januar 2018, 12:02

Hallo,
Ja an sich sollte das klappen.
Komischerweise erkennt er die von mir genannte Warnung nicht an. Wenn ich mir mit:

Code: Alles auswählen

warning.warn('valid range')
eine Warnung selber generiere kann ich durch befehle wie

Code: Alles auswählen

warnings.simplefilter('error', UserWarning)
darauf reagieren.
Ich denke das Problem liegt darin, dass die Warning von Cantera (also einem importierten Unterprogramm) ausgegeben wird und ich daher nicht weiß um was für ein Typ Warnung es sich handelt.

Bei dem Weg von @__deets__ müsste ich doch auch wissen was für ein Warnungs Typ erwartete wird oder nicht ? Ich verstehe auch nicht ganz wie ich dann die "gefangenen" exceptions weiterverarbeiten kann

Viele Grüße,
Stock63
__deets__
User
Beiträge: 2668
Registriert: Mittwoch 14. Oktober 2015, 14:29

Freitag 19. Januar 2018, 12:34

Du musst nicht wissen, wie die Warnung heißt. Aber selbst wenn - dann musst du halt mal im Quellcode nach dem Namen schielen.

Und danach interierst du einfach über das Objekt mit den Warnungen. Spiel doch mal etwas rum, kann doch nix kaputt gehen.
Antworten