Fehler in einfachem Python-Programm - wer kann helfen?

  • ich habe ein recht simples Python-Programm geschrieben, das auch funktioniert wenn ich es über mu oder thonny starte:

    #!/usr/bin/python3

    # Datei inputtest.py

    # coding: utf8

    zuname = ""

    vorname = ""

    try:

    while True:

    zuname = input("Nachname:\n")

    if zuname == "---":

    print("Programm wird beendet")

    break

    vorname = input("Vorname:\n")

    if vorname == "---":

    print("Programm wird beendet")

    break

    print("Hallo " + vorname + " " + zuname)

    except KeyboardInterrupt: # z.B. CTRL-C

    break

    Starte ich das Programm über sudo python inputtest.py aus der Shell heraus, funktioniert es nicht mehr. Hier kommt folgende Fehlermeldung:

    Nachname:

    blabla

    $> Traceback (most recent call last):

    File "inputtest.py", line 8, in <module>

    zuname = input("Nachname:\n")

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

    NameError: name 'x' is not defined

    $>

    Somit liegt der Hund wohl irgendwie in der input-Zeile begraben.

    Kann mir vielleicht jemand sagen, was hier schief läuft? Das muss auch über die Shell funktionieren.

  • Fehler in einfachem Python-Programm - wer kann helfen?? Schau mal ob du hier fündig wirst!

  • Bitte die Code-Tags benutzen, weil sonst die fuer Python imminent wichtigen Einrueckungen verloren gehen.

    In deinem gesamten Code kommt auch kein x vor. Fehlermeldung und Programm passen also auch nicht zusammen.

    Und bitte auch nicht sudo verwenden wie Salz am Esstisch. Das ist nicht eine magische Wunderformel, mit der man alles, was nicht laeuft, irgendwie zum laufen bekommt. Und nichts in deinem Code braucht sudo.

  • zwar unerheblich aber liegt daran, dass der user pi keine Rechte darauf hat. Das ist aber nicht die Ursache.

    Und ja stimmt, das mit den Code-Tags muss ich mir angewöhnen.Ich habe nur noch nicht so ganz begriffen, wie das geht

  • 2. Versuch

  • Dann zeig die vollständige Fehlermeldung. Zu dem Code von gerade. Denn ein NameError x wie behauptet kann es damit nicht kommen. Auch kein blablabla. Denn du hast nur die Namen zuname und vorname und nirgendwo x oder blablabla als VARIABLEN definiert. Und nur das löst das aus.

    Nachtrag: der Code oben ist fehlerhaft, ein break im except darf es nicht geben, und die Fehlermeldung dazu heisst auch ganz anders;

    Code
    12:25 $ python3 /tmp/test.py 
      File "/tmp/test.py", line 16
        break
        ^
    SyntaxError: 'break' outside loop

    Also wie schon erwaehnt: Code, und dazu passende Fehlermeldung. Irgendwas das irgendwann mal irgendeine Fehlermeldung geliefert hat - ??

  • Manul ich wuenschte, dieser Haufen Bytemuell wuerde endlich aus dem Internet verschwinden... wieviel Schaden der angerichtet hat, ist kaum zu beziffern.

  • @__deets__: Ich kenne die Seite sonst nicht, war halt einer der ersten Treffer, die die Suche nach dem Unterschied bei input() zwischen Python 2 und Python 3 ausspuckte. An der speziellen Erklärung kann ich auch nichts falsches finden.

    Das hier:

    Denn ein NameError x wie behauptet kann es damit nicht kommen.

    Stimmt übrigens nicht, wenn man den Fehler im except bereinigt und dann den Code mit Python 2 ausführt und "x" als Nachnamen eingibt, kommt tatsächlich genau die zitierte Fehlermeldung.

  • Stimmt übrigens nicht, wenn man den Fehler im except bereinigt und dann den Code mit Python 2 ausführt und "x" als Nachnamen eingibt, kommt tatsächlich genau die zitierte Fehlermeldung.

    Ah, wegen dem eval? Ok, ich habe das so lange nicht mehr benutzt, das war mir entfallen. felline du solltest wirklich kein Python 2 mehr benutzen. Und wenn es das sein muss, dann hat Manul mit raw_input natuerlich Recht. Aber Python 2 ist seit Anfang des Jahres komplett tot, und wird nach und nach verschwinden. Damit was neues anzufangen ist keine gute Idee.

  • $> python inputtest.py

    Nachname:

    Meier

    Traceback (most recent call last):

    File "inputtest.py", line 8, in <module>

    zuname = input("Nachname:\n")

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

    NameError: name 'Meier' is not defined

    $>

    Den Ausgabefehler kann ich nicht korrekt darstellen.Ist ja kein Code. Oder gibt es auch eine Funktion zur korrekten Darstellung der Konsolenausgabe?

  • Python
    #!/usr/bin/python3

    besser: #!/usr/bin/env python3

    zeile 2 und 3 machen gar nichts

    wenn, dann auskommentieren und die 3 muss als zweite zeile geschrieben werden, da codings in den ersten zwei zeilen geschrieben werden müssen. standardmässig wird sowieso utf-8 codiet, kannst du also komplett rauslassen ...

    Code
    print("Hallo " + vorname + " " + zuname)

    macht man heute auch nicht mehr. dafür gibt's f-strings:

    Code
    print(f"Hallo {vorname} {zuname}")

    ansonsten läuft das script doch ... bei mir jedenfalls unter python 3.8.2

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • felline du kannst auch die Code Tags für den Fehler nehmen, das ist universell.

    Und dein Fehler wurde von Manul korrekt identifiziert: mit Python 2 musst du raw_input statt input benutzen. Oder noch besser Python 3, wie schon mehrfach angemerkt.

  • das mit der geänderten Zeile 1 und dem Coding in der 2. Zeile werde ich mal prüfen.

    Wie gesagt, unter mu oder tonny läuft das bei mir auch absolut problemlos. Nur wenn ich das python in der shell nutze macht das kleine Programm diese Zicken. Als ob beim input() die Eingabe irgendwie an die Shell zurück gegeben wird. Also an die Python-Shell (die wohl im Hintergrund lauert)

  • Du musst das Programm jetzt mit python3 inputtest.py aufrufen.

    Grüße

    Dennis

    Edit:

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

  • Sch.......e das liegt wirklich daran, dass das Programm tatsächlich unter mu automatisch mit python3 gestartet wird und in der shell mit python2. wenn ich den Aufruf mit python3 inputtest.py starte läuft alles. Und in irgendeinem schaleuen Buch habe ich es so verstanden, dass über die 1. Zeile intern immer auf python3 "umgeschaltet" wird. Scheint aber nicht der Fall bei mir zu sein.

    Kann man das denn irgendwo einstellen, dass ausschließlich python 3 benutzt wird? Symbolic Link ändern oder so?

  • hast du den shebang geändert ?

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

  • hast du den shebang geändert ?

    Zitat von Handbuch Python3

    Die erste Zeile #!/usr/bin/env python3

    gibt die Position des Python-Interpreters im System an¹ und ist beim Ausführen der

    Datei als eigenständiges Programm wichtig, denn sie sagt, dass es sich um ein in Python

    3 formuliertes Skript handelt (und nicht in Python 2...)

    So wie ich das verstanden habe, hat diese Zeile mit dem Programmaufruf python3 nichts zu tun.

    Habe es gerade auch mit beiden shebang's getestet.

    Grüße

    Dennis

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

  • wenn ich den Aufruf mit python3 inputtest.py starte läuft alles.

    Dennis89 :

    also geht es mit dem aufruf inputtest.py (OHNE python3 davor) wohl nicht => shebang

    --- wer lesen kann, ist klar im Vorteil ---

    --- man sollte keine Dummheit zweimal begehen, die Auswahl ist schließlich groß genug ---

    --- der Fortschritt der Menschheit ist das Werk der Unzufriedenen ---

    --- Freude entsteht aus Mangel an Information ---

    --- Scheiße ist, wenn der Furz etwas wiegt ---

Jetzt mitmachen!

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