Shell vs. Idle

Heute ist Stammtischzeit:
Jeden Donnerstag 20:30 Uhr hier im Chat.
Wer Lust hat, kann sich gerne beteiligen. ;)
  • Moin!
    Ich fürchte ich brauche mal wieder eure Hilfe.

    Ich habe eine Python-Script mit IDLE geschrieben (siehe CODE).

    Dieses Programm funktioniert auch gut, wenn man es unter IDLE laufen lässt.

    Siehe output:

    Code
    ============ RESTART: /home/pi/Projekte/Wetterstation/LuftCron.py ============
    (22.38, 1001.3223773280776, 51.2430526923437)
    02.10.2021        18:03:17
    Temperatur:       22.4 °C
    Luftdruck:        1001.4 hPa
    Luftfeuchtigkeit: 51.2 % RH
    Taupunkt:         11.8 °C
    >>> 

    Wieso bekomme ich nun eine Fehlermeldung, wenn ich eben dieses Programm in der Shell ausführe?

    Fehlermeldung:

    Code
    pi@raspi:~/Projekte/Wetterstation $ python3 LuftCron.py
    Traceback (most recent call last):
      File "LuftCron.py", line 39, in <module>
        d = (tpk1*math.log(h/100)+((tpk2*t)/(tpk1+t)))/(tpk3-math.log(h/100)-((tpk3*t)/(tpk1+t)))
    NameError: name 'h' is not defined
    pi@raspi:~/Projekte/Wetterstation $ 

    Warum ist jetzt "h" plötzlich nicht mehr defined?

    Das Programm läuft doch eigentlich!

    Ich blick's einfach nicht.

    Kann mir einer von euch helfen?

    Vielen Dank und beste Grüße

    U32

  • Zur hilfreichsten Antwort springen
  • Ich kann nicht wirklich helfen und auch nicht sagen warum es in IDLE keine Fehlermeldung gibt. Aber gibt doch mal vor "d = " t, p und h aus um zu sehen ob die einen Wert beinhalten.

  • Hi daxb !

    Gesagt - getan
    Diese Änderung...

    bringt diesen Output in IDLE....

    und leider genau den selben Output mit der Shell...

    Code
    pi@raspi:~/Projekte/Wetterstation $ python3 LuftCron.py
    Traceback (most recent call last):
      File "LuftCron.py", line 42, in <module>
        d = (tpk1*math.log(h/100)+((tpk2*t)/(tpk1+t)))/(tpk3-math.log(h/100)-((tpk3*t)/(tpk1+t)))
    NameError: name 'h' is not defined
    pi@raspi:~/Projekte/Wetterstation $ 

    Erstmal Danke für die schnelle Antwort.

    Ich muss zugeben, dass ich auch nichts anderes erwartet habe, denn "h" ist ja eigentlich definiert, sonst würde es unter IDLE ja auch nicht laufen.

    Ich bin echt ratlos und habe so gar keinen Anhaltspunkt.

    :helpnew:

  • Schmeiß mal das try: und das allumfassende except: raus oder definiere das except wenigstens konkret! Z.B. so except KeyboardInterrupt: für Benutzerabbruch per Tastatur.

    Davon abgesehen frage ich mich ob IDLE das Skript wirklich mit Python3 ausführt, auch wenn das im Shebang steht. :conf:

  • Dann lass die Zeile "d = " weg, bzw. kommentiere diese aus. Vermutlich müssen aber alle Referenzen weg, sonst kommt die Fehlermeldung nur an anderer Stelle. Startet IDLE das Skript denn auch mit python3?

    Edit: Zu spät.

  • Dann lass die Zeile "d = " weg, bzw. kommentiere diese aus. Vermutlich müssen aber alle Referenzen weg, sonst kommt die Fehlermeldung nur an anderer Stelle. Startet IDLE das Skript denn auch mit python3?

    Edit: Zu spät.

    Hallo hyle , daxb ,

    wie kann ich das (sicher) überprüfen? Ich bin der Meinung, ich habe nur Python3 installiert.

  • wie kann ich das (sicher) überprüfen?

    Gute Frage, darauf habe ich gerade keine Antwort. :conf:

    Aber mach mal was ich im Beitrag #4 schrieb und ersetze die nackten except: mit except KeyboardInterrupt:. Damit wird wenigstens nicht jeder Fehler ignoriert und einfach durchgewunken.

    Und dann auch mal zum Gegentesten: Starte das Skript im Terminal mit Python2, also python LuftCron.py (ohne 3 nach python!) . Was passiert?

  • Was mir gerade noch eingefallen ist, da ich mich früher fragte was das soll, aber Idle nie verwendete... es gibt Idle (Python2) und es gibt Idle3 (Python3). Welches verwendest Du?

    Vielleicht hilft eine neue Datei mit dem Inhalt help() auszuführen. Da könnte die verwendete Python-Version angezeigt werden, aber ich rate da nur. :conf:

  • Das entfernen von except brachte keinen Unterschied.

    Aber das starten mit python via shell brachte eine andere Fehlermeldung:

    Code
    pi@raspi:~/Projekte/Wetterstation $ python LuftCron.py
    Traceback (most recent call last):
      File "LuftCron.py", line 6, in <module>
        import bme280
    ImportError: No module named bme280
    pi@raspi:~/Projekte/Wetterstation $ 
  • Was mir gerade noch eingefallen ist, da ich mich früher fragte was das soll, aber Idle nie verwendete... es gibt Idle (Python2) und es gibt Idle3 (Python3). Welches verwendest Du?

    Vielleicht hilft eine neue Datei mit dem Inhalt help() auszuführen. Da könnte die verwendete Python-Version angezeigt werden, aber ich rate da nur. :conf:

    IDLE3 => Soweit wusste ich es schon. Dachte es gäbe ein Kommando, mit dem man die genaue Version zurückbekommt.

  • Hallo,

    du darfst die try/except- Blöcke so nicht setzen. Wenn du Variablen in dem try-Block definierst, dann kannst du nicht davon ausgehen, dass sie ausserhalb des Blocks auch verfügbar sind. Denn der try-Block muss ja nicht durchlaufen, sondern es kann der except-Block stattdessen abgearbeitet werden und dann sind deine Variablen nicht definiert.

    Wie wurde 'bme280' installiert? Wieso rufst du das Skript mit 'python' auf und nicht mit 'python3'?

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Wie wurde 'bme280' installiert? Wieso rufst du das Skript mit 'python' auf und nicht mit 'python3'?

    Das war mein Part um es mal Gegezutesten. In original ruft er es mit python3 auf. Siehe #1! ;)

    du darfst die try/except- Blöcke so nicht setzen.

    Leider kam diesbezüglich bisher keine Rückmeldung / konkrete Fehlermeldung, bzw. wurde das ignoriert. :shy:

  • hyle oh sorry, das habe ich überlesen :blush:

    Nachtrag: Kommentare sollten dem Leser einen Mehrwert bieten und beschreiben warum der Code etwas macht. Was er macht steht da schon als Code.

    Wenn du Konstanten deklarierst, dann solltest du zum einen Konstanten KOMPLETT_GROSS schreiben zum anderen keine Abkürzungen verwenden, die man erraten muss und zum Schluss: Wenn du Namen durchnummerieren musst, dann verwendet man lieber Datenstrukturen, in dem Fall zum Beispiel eine Liste.

    Wenn wir dann schon dabei sind, Variablen schreibt man klein_mit_unterstrich und Klassen in CamelCase-Schreibweise.

    Du solltest dir gleich angewöhnen mit Funkionen zu arbeiten, denn da wo dein 'tpk1' (auf Modulebene) definiert wird, werden nur Konstanten, Funktionen und Klassen definiert. Alles andere gehört hier nicht hin.

    In Pyhton wird das Programm aus einer Funktion mit dem Namen 'main' gesteuert. Hier werden Funktionen aufgerufen, Argumente übergeben und Rückgaben entgegen genommen.

    Wieso definierst du 'datetime' zwei mal im Programm?

    Python benötigt keine Semicolon am Ende einer Zeile.

    das Thema Exceptions wurde schon angesprochen, hier kannst du die Exceptions nachlesen.

    Ungetestet und eigentlich dein Code nur etwas geordnet:

    Die Formatiererei vor dem schreiben in die Datenbank, kann man meines Wissens direkt im Aufruf einbauen.

    Schau mal, nur wenn der Sensor Werte liefert, dann werden die restlichen Funktionen ausgeführt.

    Grüße

    Dennis

    🎧 With the music execution and the talk of revolution, it bleeds in me and it goes 🎧

  • Hallo Dennis89 !

    WOW! Erstmal viel Dank, dass du dir die Zeit genommen hast, das alles durchzugehen und umzubauen!

    Die Sache mit den Konstanten, Variablen und Klassen werde ich mir merken. Für mich als "Rookie" und "Feierabend-Programmierer" ist das Selbststudium nicht immer einfach - aber das ist ein anderes Thema...

    Die Sache mit den Exception habe ich mir jetzt doch mal an den Monitor geklebt. Darauf hat mich hyle glaube ich schon das 2. Mal aufmerksam gemacht und langsam wird's peinlich. :blush:

    Ich bin euch wirklich sehr dankbar für eure Tipps, die sind wirklich immer sehr hilfreich und sie bringen mich auch jedes Mal ein Stückchen weiter,

    aber mein konkretes Problem besteht auch nach den Änderungen weiterhin.

    Auch wenn ich den von dir optimierten CODE nehme, funktioniert er unter IDLE3 direkt und tadellos, ohne, dass ich etwas ändern musste.

    Starte ich eben genau dieses Programm mit "python3" in der Shell bekomme ich eine Fehlermeldung und ich kann mir nicht erklären, warum.

    Fehlermeldung via Shell:

    In der Zwischenzeit habe ich gefunden, wo die IDLE-Version angezeigt wird.

    Es wird also Python3 verwendet.

    Bin noch immer ratlos.

    Was wird denn via Shell unter python3 anders gemacht/interpretiert als mit IDLE?

    Damit hatte ich noch nie Probleme.

    Viele Grüße

    U32

  • Damit kommen wir der Sache schon etwas näher und sehen den wahren Fehler. In IDLE wird sehr wahrscheinlich ein anderes Modul zum Auslesen des Sensors verwendet, als im normalen Python3 Interpreter.

    Welche Anleitung hast Du verwendet? Und was ist die Ausgabe von ls -la ~/Projekte/Wetterstation?

  • Ausgabe von ls -la ~/Projekte/Wetterstation:

    Was meinst du mit Anleitung? Ich habe keine Anleitung benutzt, jedenfalls nicht wissentlich.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!