Ja/nein Abfrage

  • Hallo zusammen,

    ich fange gerade an ein Prüfprogramm zu erarbeiten. In diesem Programm werden vor Beginn des eigentlichen Tests der Baugruppe ein paar Abfragen zur Version etc des Prüflings gestellt.

    Die Abfrage:

    fram = str(input("Ist ein FRAM verbaut? j/n "))

    läuft in Thonny ohne Fehlermeldung durch.

    Wenn ich das Programm in der Konsole starte, erhalte ich folgende Meldung:

    Traceback (most recent call last):

    File "testprogramm.py", line 39, in <module>

    fram = str(input("Ist ein FRAM verbaut? j/n "))

    File "<string>", line 1, in <module>

    NameError: name 'j' is not defined

    Da ich gerade erst mit Python begonnen habe, kann ich mir keinen Reim auf diese Meldung machen. Recherche im Netz hat bis jetzt auch nichts ergeben.

    Ich hoffe, es kann mir jemand helden.

    Grüße

    Michael

  • Hallo,

    zeig uns mal bitte dein ganzes Programm.

    Übrigens gibt 'input' schon einen String zurück, das 'str' davor ist deswegen nicht nötig.

    Grüße

    Dennis

    Edit: Bitte den Code in Code-Tags posten, das ist der </> - Button.

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

  • Hier folgt der ganze Code (soweit wie ich bin):

  • Hallo,

    du musst die Abfrage 'if test5v = j:' anderst gestalten.

    Zum einen wird mit einem Gleichheitszeichen etwas zugewiesen, das heißt ein Vergleich findet mit zwei Gleichheitszeichen statt und zum anderen hast du in deinem Code nirgends geschrieben, was 'j' sein soll. Deswegen auch die Fehlermeldung. 'j' wird als Namen erkannt und nicht als deinen String, den du mit deiner Inputabfrage an 'test5v' bindest.

    Das heißt du musst nach dem String 'j' abfragen und das macht man, in dem man den Buchstaben in Anführungszeichen setzt.

    if test5v == "j":

    Das kommt weiter unten im Code auch noch.

    Grüße

    Dennis

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

  • Hallo nochmal,

    die Fehlermeldung kommt aber schon, wenn ich im Terminal auf die Abfrage, ob ein FRAM verbaut ist, mit j oder n antworte.

    in Zeile 38 wird die Version abgefragt. Eingabe 2.1

    In Zeile 39 wird nach dem FRAM gefragt.

    Hier nochmal die komplette Ausgabe:

    Welche Version soll getestet werden (z.B. 2.1)? 2.2

    Ist ein FRAM verbaut? j/n j

    Traceback (most recent call last):

    File "testprogramm.py", line 39, in <module>

    fram = str(input("Ist ein FRAM verbaut? j/n "))

    File "<string>", line 1, in <module>

    NameError: name 'j' is not defined

  • Bist du dir sicher das die Fehlermeldung zu deinem script in 3# passt? Im script hast du im input string 3 Leerzeichen aber im Terminal nur 1. Wenn ich dein script laufen lassen kommt

    Code
      File "raspi_test.py", line 62
        if test5v = j:
                  ^
    SyntaxError: invalid syntax

    Der gleiche Fehler hast du auch bei test3v3, , Zeile 73. Danach solltest du auch die ganzen prints am Ende ändern, oder benutzt du python2?

    Ich würde auch noch eine Prüfung der Eingabe einbauen. Wenn ich J (Groß und Kleinschreibung) eingebe erkennt dein Program das nicht.


    Ungetestet

  • michael1959 Verwende python3, auch im Skript!

    Ddort fehlen dazu die Klammern bei print.

    Ist: print "Versorgungsspannung 5V.....pass"

    soll: print("Versorgungsspannung 5V.....pass")

    Python 2 ist veraltet und hat sein EOL schon einen Weile überschritten!

    Zeige bitte die konkrete Fehlermeldung (in einem Codeblock) zum aktuellen Skript! Die beiden Teile (Skript + kompletter Traceback) sind ein Paar und gehören zusammen, sonst ist die Fehlermeldung für die Katz.

  • Ihr vergesst, dass er Python2 verwendet.

    Die Funktion input evaluiert die Eingabe des Nutzers. D.h. wenn der Nutzer z.B. j eingibt, versucht Python 2 die Eingabe zu interpretieren. Da der Name j nicht vergeben ist, kommt es zu einem NameError.

    Stattdessen soll man die Funktion raw_input verwenden, da diese die Eingabe nicht interpretiert, sondern ein str Objekt ausgibt.

    Viel besser wäre es aber durchweg Python 3 zu verwenden.

    Einerseits lässt sich das durch das Anhängen der 3 erzwingen.

    Code
    python3 script.py

    Andererseits, wenn man irgendwelche Abhängigkeiten installieren muss, sind virtuelle Umgebungen für den Interpreter ganz sinnvoll.

    Wenn man im Terminal diese Regeln beachtet, hat man weniger Probleme.

    Das eigentliche Problem ist, dass teilweise Python 2.7 immer noch von anderen Programm genutzt wird, obwohl es seit 2020 nicht mehr weiterentwickelt wird. Schon seit einer halben Ewigkeit, wird durch die Eingabe von python Python 2.X gestartet und nicht Python 3. Manche Distributionen haben das Verhalten geändert. Debian nicht und Rasberry Pi OS folglich auch nicht. Man kann es manuell umstellen, besser ist es aber sich anzugewöhnen, dass nebenbei meisten noch Python 2.7 installiert ist und wenn man entwickelt möchte man möglichst vermeiden Code mit diesem Interpreter auszuführen.

    Für Scripts gilt allgemein, dass unter Linux der Shebang festlegt, mit welchem Interpreter der Quellcode ausgeführt wird.

    Code
    !#/usr/bin/env python3

    oder wenn man etwas inkompatibler sein möchte:

    Code
    !#/usr/bin/python3

    Beim ersten Beispiel wird das Programm /usr/bin/env mit dem Argument python3 aufgerufen und übergibt den Pfad des Interpreters via stdout, was dann letztendlich verwendet wird, um das Script auszuführen.

    Beim zweiten Beispiel wird der Pfad zum Interpreter direkt angegeben und erwartet, dass sich dieser dort befindet.

    In den meisten Fällen ist das der Fall, aber unter Mac müsste das abweichen und Windows wäre noch mal ein ganz anderes Thema.

    In beiden Fällen muss das Script mit

    Code
    chmod +x name_des_scripts.py 

    Ausführbar gemacht werden. Dann mit ./ starten:

    Code
    ./name_des_scripts.py

    Wenn man hingegen den Interpreter mit angebit, wird der Shebang ignoriert.

    Folglich startet folgender Befehl das Programm mit Python 2.7 (falls es installiert ist):

    Code
    python2 name_des_scripts.py

    Dort braucht man auch nicht ./ davor zu schreiben.

    Das ist unter Linux ein Sicherheitsfeature, damit man nicht aus Versehen gleichnamige Programme, die sich im aktuellen Verzeichnis befinden, startet werden, wenn man stattdessen ein System-Tool meinte.

    Auf das Script selbst gehe ich jetzt nicht ein.

    Einmal editiert, zuletzt von RestlessMud46765 (31. Oktober 2021 um 20:39)

  • @DeaD_EyE ich kenne mich nicht mit python2 aus aber müsste ich dann nicht den selben Fehler bekommen? Oder ist das am Mac anders?

    Code
    Olivers-MacBook-Air:test_center oliver$ python --version
    Python 2.7.16
    Olivers-MacBook-Air:test_center oliver$ python new_test.py 
      File "new_test.py", line 62
        if test5v = j:
                  ^
    SyntaxError: invalid syntax

    Ich nutze das script aus #3, ich habe nur alles was GPIO drin hatte auskommentiert.

  • Irgendwie konnte ich es nicht sein lassen. os.system soll man nicht mehr nutzen. Das ist aber auch so das einzige, was dem alten Code entspricht.


  • Oder ist das am Mac anders?

    Ich habe kein Mac. Wenn der Mac Python2 installiert hat und diesen verwendet, müsste der gleiche Fehler kommen.

    Falls python3 gestartet wird, kommt der Fehler nicht mehr, da raw_input nun input ist.

    Existierender Python 2.7-Code, der input verwendet, ist meist auch angreifbar.

  • Hallo,

    danke für die vielen Tipps.

    Ich benutze python 3.7.3, nicht python 2.

    @DeaD_EyE : Vielen Dank für Deinen Code. Da muss ich mich erstmal durcharbeiten, um ihn zu verstehen. Läuft in Thonny einwandfrei, im Terminal meckert Linux über die Umlaute.

    Beste Grüße, Michael

  • hyle: Ist tatsächlich Python 3.7.3

    Python 3.7.3 (/usr/bin/python3)

    >>> %Run test2.py

    TERM environment variable not set.

    Welche Version soll getestet werden (z.B. 2.1)? 2.1

    Leuchtet die 5V-LED? j/n j

    Leuchtet die 3,3V-LED? j/n n

    Versorgungsspannung 5V ........................... pass

    Versorgungsspannung 3V ........................... fail

    >>>

Jetzt mitmachen!

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