Fehler: Tabnanny Error: EOF in multi-line statement

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.
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

Hallo Leute,

ich stehe noch einigermaßen am Anfang mit Python und bin jetzt auf einen mir unbekannten Fehler gestoßen, den ich beim Programmieren verursacht habe, jeoch auch aus dem Quelltext nicht erkennen kann, woher der Fehler kommt....

Der Fehler kommt beim Ausführen des Skripts in der Shell...oben im Titel der Name beschrieben...
Vielleicht kann mir jemand eine Lösung vorschlagen, der Quelltext kann auch gepostet werden, wenn nötig.

MFG
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Jo, bitte den Quelltext. Das sieht für mich nicht wie ne normale Python Exception aus.
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

So, hier is der Quelltext...vorher habe ich halt noch die einzelnen Definitionen für die einzelnen Rechneoperationen, die sind allerdings zu 100% richtig, deshalb habe ich die jetzt aus Platzgründen weggelassen.
Sind wahrscheinlich noch etliche Fehler drin, die ich eigtl anhand der Fehlermeldungen beheben wollte, allerdings kann ich das Programm garnicht ausführen...

Code: Alles auswählen

beenden=0
Wahl=[1,2,3,4,5,6]
positiv=['ja','JA','Ja']
negativ=['nein','Nein','NEIN']
Ziffern=[1,2,3,4,5,6]
while beenden==0:
    Menü=0
    print 'Wählen sie bitte durch Eingabe der vorstehenden Nummer das Programm, das Sie ausführen wollen.'
    print '%2i,%2s'%(1,'Größter gemeinsamer Teiler')
    print '%2i,%2s'%(2,'Teiler einer Zahl')
    print '%2i,%2s'%(3,'Teiler zweier Zahlen')
    print '%2i,%2s'%(4,'Kleinstes gemeinsames Vielfaches')
    print '%2i,%2s'%(5,'Test auf Primzahleigenschaft')
    print '%2i,%2s'%(6,'Primfaktorzerlegung')
    Auswahl=nat_Eingabe('Bitte geben Sie nun die Nummer des gewünschten Programmes ein: ')
    while Auswahl==1:
        Menü=1
        m=nat_Eingabe('Geben Sie die erste Zahl ein: ')
        n=nat_Eingabe('Geben Sie die zweite Zahl ein: ')
        print 'Der ggT der Zahlen',m,'und',n,'ist',ggT(m,n)
        try:
            möglich=[1,2,3]
            stop=raw_input(' Möchten Sie erneut einen ggT berechnen, zum Menü zurückkehren, oder ganz beenden?')
            print 'Tippen Sie zum erneuten Berechnen die Ziffer -> 1 <-'
            print 'Tippen Sie zum Zurückkehren zum Menü die Ziffer -> 2 <-'
            print 'Tippen Sie zum beenden die Ziffer -> 3 <-'
            if stop in möglich:
                if stop==1:
                    Auswahl=1
                elif stop=2:
                    Auswahl=99
                    beenden=0
                elif stop=3:
                    Auswahl=99
                    beenden=1
                    print 'Vielen Dank für die Verwendung.'
        except:
            print 'Geben sie bitte eine der drei möglichen Ziffern ein.'
    while Auswahl==2:
        Menü=1
        a=nat_Eingabe('Geben Sie die Zahl ein: ')
        print 'Die Teiler der Zahl sind',teiler_einer_zahl(a),'.'
        try:
            möglich=[1,2,3]
            stop=raw_input(' Möchten Sie erneut einen ggT berechnen, zum Menü zurückkehren, oder ganz beenden?')
            print 'Tippen Sie zum erneuten Berechnen die Ziffer -> 1 <-'
            print 'Tippen Sie zum Zurückkehren zum Menü die Ziffer -> 2 <-'
            print 'Tippen Sie zum beenden die Ziffer -> 3 <-'
            if stop in möglich:
                if stop==1:
                    Auswahl=2
                elif stop=2:
                    Auswahl=99
                    beenden=0
                elif stop=3:
                    Auswahl=99
                    beenden=1
                    print 'Vielen Dank für die Verwendung.'
        except:
            print 'Geben sie bitte eine der drei möglichen Ziffern ein.'
    while Auswahl==3:
        Menü=1
        a=nat_Eingabe('Geben Sie hier die erste Zahl ein: ')
        b=nat_Eingabe('Geben Si enun die zweite Zahl ein: ')
        print 'Die gemeinsamen Teiler der Zahlen',a,'und',b,'sind',teiler_zweier_zahlen(a,b)'.'
        try:
            möglich=[1,2,3]
            stop=raw_input(' Möchten Sie erneut einen ggT berechnen, zum Menü zurückkehren, oder ganz beenden?')
            print 'Tippen Sie zum erneuten Berechnen die Ziffer -> 1 <-'
            print 'Tippen Sie zum Zurückkehren zum Menü die Ziffer -> 2 <-'
            print 'Tippen Sie zum beenden die Ziffer -> 3 <-'
            if stop in möglich:
                if stop==1:
                    Auswahl=3
                elif stop=2:
                    Auswahl=99
                    beenden=0
                elif stop=3:
                    Auswahl=99
                    beenden=1
                    print 'Vielen Dank für die Verwendung.'
        except:
            print 'Geben sie bitte eine der drei möglichen Ziffern ein.'
    while Auswahl==4:
        Menü=1
        a=nat_Eingabe('Bitte geben Sie die erste Zahl ein: ')
        b=nat_Eingabe('Bitte geben Sie nun die zweite Zahl ein: ')
        print 'Das kleinste gemeinsame Vielfache der Zahlen',a,'und',b,'ist',kgv(a,b),'.'
        try:
            möglich=[1,2,3]
            stop=raw_input(' Möchten Sie erneut einen ggT berechnen, zum Menü zurückkehren, oder ganz beenden?')
            print 'Tippen Sie zum erneuten Berechnen die Ziffer -> 1 <-'
            print 'Tippen Sie zum Zurückkehren zum Menü die Ziffer -> 2 <-'
            print 'Tippen Sie zum beenden die Ziffer -> 3 <-'
            if stop in möglich:
                if stop==1:
                    Auswahl=4
                elif stop=2:
                    Auswahl=99
                    beenden=0
                elif stop=3:
                    Auswahl=99
                    beenden=1
                    print 'Vielen Dank für die Verwendung.'
        except:
            print 'Geben sie bitte eine der drei möglichen Ziffern ein.'
    while Auswahl==5:
        Menü=1
        a=nat_Eingabe('Geben Sie hier die zu prüfende Zahl ein: ')
        print 'Die Zahl',a,'ist',Primzahltest(a),'.'
        try:
            möglich=[1,2,3]
            stop=raw_input(' Möchten Sie erneut einen ggT berechnen, zum Menü zurückkehren, oder ganz beenden?')
            print 'Tippen Sie zum erneuten Berechnen die Ziffer -> 1 <-'
            print 'Tippen Sie zum Zurückkehren zum Menü die Ziffer -> 2 <-'
            print 'Tippen Sie zum beenden die Ziffer -> 3 <-'
            if stop in möglich:
                if stop==1:
                    Auswahl=5
                elif stop=2:
                    Auswahl=99
                    beenden=0
                elif stop=3:
                    Auswahl=99
                    beenden=1
                    print 'Vielen Dank für die Verwendung.'
        except:
            print 'Geben sie bitte eine der drei möglichen Ziffern ein.'
    while Auswahl==6:
        Menü=1
        a=nat_Eingabe('Geben Sie die zu zerlegende Zahl ein: ')
        print 'Die Primfaktoren der Zahl',a,'sind',Primfaktorzerlegung(a),'.'
        try:
            möglich=[1,2,3]
            stop=raw_input(' Möchten Sie erneut einen ggT berechnen, zum Menü zurückkehren, oder ganz beenden?')
            print 'Tippen Sie zum erneuten Berechnen die Ziffer -> 1 <-'
            print 'Tippen Sie zum Zurückkehren zum Menü die Ziffer -> 2 <-'
            print 'Tippen Sie zum beenden die Ziffer -> 3 <-'
            if stop in möglich:
                if stop==1:
                    Auswahl=6
                elif stop=2:
                    Auswahl=99
                    beenden=0
                elif stop=3:
                    Auswahl=99
                    beenden=1
                    print 'Vielen Dank für die Verwendung.'
        except:
            print 'Geben sie bitte eine der drei möglichen Ziffern ein.'
    while Auswahl not in Ziffern:
        print 'Geben Sie bitte eine der möglichen sechs Ziffern an, möchten Sie jedoch beenden, tippen Sie "beenden" ein. '\n
        try:
            beenden=raw_input('Tippen Sie nun die Ziffer oder "beenden" ein: ')
            if beenden in Ziffern:
                beenden=0
            elif beenden='beenden':
                beenden=1
                print 'Vielen Dank für die Verwendung!'
        except:
            print 'Geben Sie eine der Wahlmöglichkeiten ein: ')
[/code]
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Da ich jetzt den "wohlverdienten" Feierabend antreten will nur kurz die Dinge die garnicht gehen:

- Variablen namen bitte niemals mit Umlauten schreiben.

- Wenn Umlaute in Kommentaren oder Stirngs verwendet werden braucht man in der ersten Zeile so einen Eintrag:

Code: Alles auswählen

# -*- coding: latin-1 -*-
- Vergleiche macht man mit == ich habe auf dem ersten Blick ein paar "elif stop=3" gesehen. Das wird nicht funktionieren.

Bügel erstmal diese Fehler aus und dann guck dann mal weiter wie weit du kommst.

Viel Erfolg!

N8 Zap

PS: Würde dir den Tipp geben vorerst ein eines der Python Tutorials durchzuarbeiten. Das sieht nach nem ziemlichem Codegemisch aus aber nicht nach Python. Ganz gut wäre es auch sich im Anschluss mal die PEP8 anzugucken.
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

Danke ZAP,
das mit den Vergleichen ist mir bekannt, sind kleine Tippfehler die aber später beim Ausführen aufgefallen wären... Werde die erstmal korrigieren und dann die mir bisher unbekannte Sache mit dem Umlauten korrigieren, danke für diese Info. Hoffe, es wird dann funktionieren.
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

noch zu dem tutorial-vorschlag...
bin wie gesagt erst am anfang; ich arbeite erst seit fast einem 3/4 jahr im informatikkurs damit...da habe ich bisher keine anderen sachen gelernt, um so etwas zu programmieren...kannst du mir ein gutes tutorial empfehlen?
wäre wahscheinlich recht interessant. habe zwar eine python-referenz als handbuch, jedoch hilft diese auch nicht immer...

MFG N8
Benutzeravatar
phxx
User
Beiträge: 31
Registriert: Freitag 5. Mai 2006, 19:47

Gute Englische Tutorials sind:

http://docs.python.org/tut/tut.html Das "offizielle" Tutorial
http://www.diveintopython.org/toc/index.html Ein ganz gutes Buch für Einsteiger
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

So, habe jetzt das Problem mit den Umlauten und den Vergleichsoperatoren ausgebessert.. Allerdings kann ich das Skript immernoch nicht ausführen...
Kann vllt beim Laden der vorangestellten Definitionen ein Fehler auftreten? Weil mir fällt nichts ein, was das Problem verursachen könnte, da bisher alle Skripte eine ähnliche Struktur hatten...
Ich müsste das Programm allerdings öffnen können, weil es für meinen Informatikkurs ist, ich will auch hier keine Lösung für das eigentliche Programm ergattern im Nachhinein, sondern nur wissen, wieso ich es nicht starten kann... Nicht, dass das missverstanden wird ;)

MFG
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

Danke übrigens noch für die Tutorials, werde mich bei Gelegenheit shcnellstmöglich durcharbeiten.

MFG
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Was für eine Fehlermeldung bekommst du denn?
Immer noch die, die im Header aufgeführt ist?
Die sieht nämlich für mich nicht nach einer Python Eception aus.
Kannst du denn andere "einfache" Skripte ausführen?
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

ja, ich bekomme immer noch die meldung, die im header aufgeführt ist...
ich kann dir auch gerne meine .py-datei schicken, damit du den fehler sozusagen live beobachten kannst...
wie gesagt, ich kann sonst alle anderen skripte ausführen.
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Sieh mal einer an, was google zu dem Stichwort tabnanny so zu Tage foerdert:
http://docs.python.org/lib/module-tabnanny.html hat geschrieben:tabnanny -- Detection of ambiguous indentation

For the time being this module is intended to be called as a script. However it is possible to import it into an IDE and use the function check() described below.
Anscheinend fuehrst du deinen Code nicht aus der Konsole aus, sondern aus aus einem Editor oder IDE, welcher die Tabnanny startet. Die Tabnanny warnt dich vor Problemen mit Whitespaces/Tabs, man sollte in Python-Code naemlich am besten nie Tabs verwenden, sondern immer mit vier Leerzeichen einruecken.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

danke rebecca,
das könnte eine erklärung sein, jedoch hatte ich bisher nie probleme, wenn ich mit TAB eingerückt habe und wie soll ich das jetzt wieder rückgängig machen? soll ich wieder das komplette skript insofern überarbeiten, dass ich alle tabs rückgängig mache und durch hunderte leerzeichen ersetze?
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

Jeder gute Editor kann dir diese Arbeit abnehmen.
Selbst die IDLE bietet dir und Format Untabify.
Hab ich zumindest gerade mal nachgeguckt. Benutze die IDLE nicht, aber vielleicht hilft dir das.

Unter unglücklichen Umstände musst du die Korrekturen aber manuell kontrollieren. (Hängt davon ab wie sauber zuvor getabt wurde )
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

also wenn ich das richtig verstanden habe, soll ich die funktion Untabify Region ausführen, und dann die Einrückungen manuell vornhemen!?
nicht, dass ich noch was falsch mache...
BlackJack

Vielleicht solltest Du erst einmal das Programm ohne Tabnanny ausführen. Die Meldung ist ja schliesslich nicht zu Tab/Leerzeichen-Problemen, sondern scheint eher auf ein (anderes) Problem mit der Syntax hin zu weisen.

Gibt's denn keinen ordentlichen Stacktrace, der auf eine Quelltextzeile hinweist, und den Du uns mal zeigen könntest?

Welche IDE verwendest Du denn? Python-IDEs verwenden in der Regel schon die im Style Guide empfohlenen 4 Leerzeichen pro Einrückebene.
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

So, er bringt keine konkrete Zeilenangabe...
Meldung lautet:

"Tabnanny Tokenizing Error - Token Error: EOF in multi-line statement"

Wie kann ich das Progframm ohne Tabnanny ausführen? Wie gesagt, ich bin noch relativ neu in dem Gebiet. Ich verwende die standardmäßige Einstellung von Python; also 4 Leerzeichen pro TAB, falls du das meinst.
BlackJack

Programme starten wird in der [wiki]FAQ#WieStarteIchSkripte[/wiki]unter Punkt 4 erklärt.

Ansonsten müsstest Du mal verraten wie Du Programme im Moment startest und welche IDE Du verwendest. Die ruft ja anscheinend Tabnanny auf.
Evil4President
User
Beiträge: 83
Registriert: Dienstag 15. Januar 2008, 15:39
Kontaktdaten:

Also, ich speichere die Programme bisher noch nicht als .exe, weil ich es momentan auch für den Unterricht arbeiten etc. nicht verwenden muss/soll...

Zum starten öffne ich das skript in der IDLE und starte dann mit F5 in der Python Shell. Habe allerdings auch schon über 'cmd' gestartet...

Wenn du mir nun noch erklärst, was du unter IDE verstehst, kann ich dir auch sagen was ich verwende. Kenne mich in den Abkürzungen und so noch nicht so richtig aus und versuche mir das Wissen nach und nach anzueignen, aber so ist das nunmal am Anfang...
Zap
User
Beiträge: 533
Registriert: Freitag 13. Oktober 2006, 10:56

IDE -> Integrated Development Environment
Sowas wie deine IDLE, es gibt aber noch viele andere.
Wenn du dein Programm über die cmd startest dann solltest du eine ausführlichere Fehlermeldung bekommen.
Versuche das mal.

So nebenbei: In python baut man keine exe Files.
Das kann man zwar auf einem anderen Wege hinbekommen, man darf es aber nicht mit Kompilieren von Sourcen wie C/C++ verstehen.
Der Pythoncode wird in der Regel durch den Interpreter ausgeführt.
Antworten