except bei Python 2/3

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.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo,

ich bearbeite meine Pythonübungen unter NetBeans 8.2. Damit kann ich grundsätzlich auch Debuggen. Mit der Version 2.x funktioniert das einwandfrei. Mit der Version 3.x gibt es ein Problem:

Die für das Debugging verwendeten Dateien jpydaemon.py, jpydaemon.py und dbgnetwork.py sind für Python 2.x erstellt und müssen von Hand an Python 3.x angepasst werden. Die fehlenden Klammern für "print" und "exec" und die Umbenennung des Moduls "__builtin__" zu "builtins" habe ich bereits korrigiert.

Jetzt hänge ich an des Syntax von "except". Hier ein Auszug aus der Version für Python 2.x:

Code: Alles auswählen

except socket.error, (errno,strerror):
        print("ERROR:JPyDbg connection failed errno(%s) : %s" % ( errno , strerror ))
und hier mein Versuch der Anpassung für Python 3.x:

Code: Alles auswählen

except socket.error as e:
        print("ERROR:JPyDbg connection failed errno(%s) : %s" % ( e.errno , e.strerror ))
Dabei bekomme ich aber folgende Fehlermeldung:

Code: Alles auswählen

  File "C:\Users\UName\AppData\Roaming\NetBeans\8.1\config\nbPython\debug\nbpythondebug\dbgnetwork.py", line 103
    except socket.error as e:
                            ^
  TabError: inconsistent use of tabs and spaces in indentation
Ich kann damit nichts anfangen.
Benutzeravatar
pillmuncher
User
Beiträge: 1532
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@kodela: Google Transelate sagt, "inconsistent use of tabs and spaces in indentation" heißt "inkonsistente Verwendung von Tabulatoren und Leerzeichen in Einkerbung" :mrgreen:

Du hast bei der Einrückung Tabs und Leerzeichen gemixt. Am besten du verwendest ausschließlich Leezeichen. NetBeans sollte sich entsprechend konfigurieren lassen.
In specifications, Murphy's Law supersedes Ohm's.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @pillmuncher:

danke für den Hinweis. Hm, - ich hätte natürlich erwähnen müssen, dass ich das, was Du mir empfiehlst, bereits berücksichtigt habe und zwar alle Einrückungen einmal über Tabs und dann auch noch über Leerstellen.

Auf Deinen Hinweis habe ich das noch einmal überprüft und bin mir absolut sicher, dass es nicht an den Einrückungen liegt.

Hier noch einmal die beiden Zeilen, so wie ich sie eben kopiert habe:

Code: Alles auswählen

        except socket.error as e:
            print("recv interupted errno(%s) : %s" % ( e.errno , e.strerror )
Leider macht der Editor hier etwas anderes daraus. Er verschluckt in der ersten Zeile die acht Leerstellen. Ich habe es daher mit der Standardformatierung versucht, da stimmt es.

MfG, kodela
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

Da liegst du falsch. Es ist nicht so als ob Interpreter nicht Bugs hätten aber ich glaube ich lehne mich nicht allzu weit aus dem Fenster, wenn ich behaupte dass der Lexer und speziell dieser Teil des Lexers keine hat.

Lass dir einfach mal Whitespace von deinem Editor anzeigen, es dürfte dann bestimmt auffallen.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @DasIch:

ich weiß nicht, wieso und weiß nicht warum, es ist mir hier auch noch nicht passiert, aber ich habe es mindestens dreimal versucht und habe am Ende die acht Leerzeichen der ersten Zeile von Hand eingefügt, es half alles nicht, mit der Formatierung für Python wurden in der ersten Zeile alle Leerzeichen verschluckt. Ich probiere es hier noch einmal:

Code: Alles auswählen

except socket.error as e:
            print("recv interupted errno(%s) : %s" % ( e.errno , e.strerror )
Jetzt nach dem Einfügen sehe ich die Leerzeichen in der ersten Zeile. Das war vorhin genau so. Egal wie es nachher ist, ich werde nichts mehr daran ändern.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Der Fehler liegt _definitiv_ am mischen von Leerzeichen und Tabs fuer die Einrueckung, denn das ist der erste Fehler der ausgeloest wird, bevor ueberhaupt Syntaxfehler auftreten koennen.

Das kannst du jetzt noch so oft posten, helfen wird es nicht, weil genau diese Unterschiede vom Forum verschluckt werden, weil ein Tab nicht dargestellt werden kann.
Ich rate jetzt aber mal, aufgrund dessen, dass die `print` Zeile immer mit 8 Zeichen eingerueckt ist: Da ist ein Tab und du benutzt sonst Leerzeichen.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @cofi: und @DasIch:

warum glaubt man anderen einfach nicht. Ich habe jetzt die beiden Zeilen aus dem Skript in eine Textdatei kopiert und deren Inhalt mit einem Hexeditor überprüft. Hier das Ergebnis:

Bild
Ich benutze ausschließlich Leerzeichen, denn der Editor von NetBeans ist bei mir so eingestellt, dass Tabs in Leerzeichen umgewandelt werden. Außerdem werden die Leerzeichen (und Tabs wenn keine Umwandlung in Leerzeichen festgelegt ist) angezeigt und die Einrückpositionen durch senkrechte Linien ebenfalls.

Übrigens verschluckt der Editor hier grundsätzlich Leerzeichen. Das ist an meinen beiden ersten Codebeispielen zu sehen. Der Editor geht bei einer Formatierung für Python davon aus, dass die erste Zeile keine führenden Leerstellen hat und richtet danach den übrigen Text aus.
Zuletzt geändert von kodela am Donnerstag 17. Dezember 2015, 14:44, insgesamt 1-mal geändert.
Benutzeravatar
/me
User
Beiträge: 3561
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

kodela hat geschrieben:Ich habe jetzt die beiden Zeilen aus dem Skript in eine Textdatei kopiert und deren Inhalt mit einem Hexeditor überprüft.
Wenn du dir völlig sicher bist, dass in den Zeilen davor nirgendwo der Hex-Wert 09 (Tabulator) auftritt, dann schaust du in eine andere Datei als die, die du ausführst.
Benutzeravatar
pillmuncher
User
Beiträge: 1532
Registriert: Samstag 21. März 2009, 22:59
Wohnort: Pfaffenwinkel

@kodela: Wie sehen denn die Zeilen vor dem except aus? Manche Syntaxfehler bemosert Python erst in der darauffolgenden Zeile.
In specifications, Murphy's Law supersedes Ohm's.
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

kodela hat geschrieben:Hallo @cofi: und @DasIch:

warum glaubt man anderen einfach nicht.
Das hat nichts damit zu tun ob ich dir glaube oder nicht. Ich hab kein Problem damit zu glauben dass du glaubst es gäbe keine Tabs in der Datei. Sollte allerdings tatsächlich in deiner Datei kein Tab sein, wäre die Exception ein Bug im Lexer. Das ist ein sehr kleiner, sehr einfacher, sehr übersichtlicher Teil des Interpreters. Es ist natürlich nicht formel bewiesen dass in dem Code keine Bugs sind aber man ist da schon nah dran.

Statt irgendwelche Sachen irgendwo hin zu kopieren solltest du dir Datei anschauen, öffnen die du auch tatsächlich ausführst.

Code: Alles auswählen

python -c 'print(b"\t" in open("your.py", "rb").read())'
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @pillmuncher:

Hier die Zeilen davor, genauer, die ganze Funktion:

Code: Alles auswählen

def readNetBuffer( self ):
        """ reading on network socket """
        try:
            if ( self._lastBuffer.find('\n') != -1 ):
                return self._lastBuffer ; # buffer stills contains commands
            networkData = self._connections['in'].recv(1024)
            if not networkData:  # capture network interuptions if any
                return None
            data = self._lastBuffer + networkData
            return data
        except socket.error as e:
            print("recv interupted errno(%s) : %s" % ( e.errno , e.strerror )
            return None
Obwohl ich hier bei der Eingabe in der ersten Zeile Leerzeichen sehe (4) bin ich mir sicher, dass am Ende vor der ersten Zeile dann keine Leerzeichen mehr angezeigt werden.

@/me:
Ich verstehe ja, dass Du nach einer Erklärung sucht, wenn etwas unerklärlich erscheint. Aber aus meinem ersten Beitrag hättest Du entnehmen können, dass ich an der richtigen Datei arbeite, denn ansonsten hätten sich die von mir erwähnten Änerungen ja nicht auswirken können.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @DasIch:

Code: Alles auswählen

C:\Users\UName\AppData\Roaming\NetBeans\8.1\config\nbPython\debug\nbpythondebug>
D:\Python35\python -c 'print(b"\t" in open("dbgnetwork.py", "rb").read())'
#Dein text: python -c 'print(b"\t" in open("your______.py", "rb").read())'
  File "<string>", line 1
    'print(b\t
             ^
SyntaxError: EOL while scanning string literal
Das ist das Ergebnis. Die kommentierte Zeile habe ich natürlich nachträglich eingefügt und den Zeilenumbruch nach dem Prompt auch.

Ich mache das für mich etwas einfacher, ziehe die betreffende Datei auf die Verknüpfung des HexEditors und suche über Strg+F nach dem Hexwert "09". Ergebnis: "09" kann nicht gefunden werden.

PS: Mit ". . . am Ende vor der ersten Zeile . . ." in meinem vorstehenden Beitrag war natürlich nicht das räumliche sondern das zeitliche Ende gemeint. Also wenn der Beitrag abgesendet ist, dann ... und so ist es ja auch. Nicht einmal die Folgezeilen werden richtig ausgerichtet.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

kodela hat geschrieben:

Code: Alles auswählen

C:\Users\UName\AppData\Roaming\NetBeans\8.1\config\nbPython\debug\nbpythondebug>
D:\Python35\python -c 'print(b"\t" in open("dbgnetwork.py", "rb").read())'
#Dein text: python -c 'print(b"\t" in open("your______.py", "rb").read())'
  File "<string>", line 1
    'print(b\t
             ^
SyntaxError: EOL while scanning string literal
Das ist das Ergebnis. Die kommentierte Zeile habe ich natürlich nachträglich eingefügt und den Zeilenumbruch nach dem Prompt auch.
Die Windows-Shell (`cmd.exe`) verhält sich hier anders als eine Unix-Shell. Ändere den Befehl mal wie folgt:

Code: Alles auswählen

python -c "print('\t' in open(r'C:\Pfad\zur\Datei.py').read())"
Wobei du den Pfad entsprechend anpasst, damit die betroffene Datei gelesen wird.

Es wäre für die Klärung schon sehr wichtig, ob da `True` oder `False` herauskommt. Auch ich kann mir nämlich kaum vorstellen, dass es sich hier um einen Bug in Python handelt. Nichts für ungut.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Bitte löschen,

Dieser Beitrag entstand aus Versehen, als ich den noch nicht fertigen Beitrag absandt, um die Zeilennummern, auf die ich mich beziehen wollte, festzustellen.

Danke
Zuletzt geändert von kodela am Donnerstag 17. Dezember 2015, 18:11, insgesamt 2-mal geändert.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @snafu:

Danke für Dein Interesse an meinem Problem. Hier das unveränderte Ergebnis auf Deinen Vorschlag:

Code: Alles auswählen

C:\Users\UName\Desktop>python -c "print('\t' in open(r'C:\Users\Rudi\AppData\Roam
ing\NetBeans\8.1\config\nbPython\debug\nbpythondebug\dbgnetwork.py').read())"
True
Dass es sich um einen Bug in Python handelt, kann ich mir auch nicht vorstellen, das halte ich eigentlich für ausgeschlossen.

Das Schöne ist, dass die Fehlermeldung jetzt um zwei Zeilen nach unten gerutscht ist. Jetzt kommt diese Meldung:

Code: Alles auswählen

Debug session Abort =1
  File "C:\Users\Rudi\AppData\Roaming\NetBeans\8.1\config\nbPython\debug\nbpythondebug\dbgnetwork.py", line 117
    return None
         ^
SyntaxError: invalid syntax
Was mich mittlerweile total verwirrt, ist der Umstand, dass die in meinem ersten Beitrag gemeldete Fehlermeldung, die sich auf die Zeile 103 bezog, langsam nach unten wandert. Dazu hier einen etwas größeren Auszug:

Code: Alles auswählen

def connect( self  )  :
        # start in listen mode waiting for incoming sollicitors
        if self._host == None :
            self._connections['in'] ,addr = self._connections['in'].accept()
            self._connections['out'] ,addr = self._connections['out'].accept()
            print("connected by " , addr)
            self._connected = True
        else :
            try:
                self._DBG(">connecting Port  %s "  %  (str(self._port)) )
                self._connections['in'].connect( (self._host , self._port)  )
                self._DBG(">connecting Port  %s"  %  ( str(self._port+1)) )
                self._connections['out'].connect( (self._host , self._port+1)  )
                print("JPyDbgI0001 : connected to " , self._host)
                self._connected = True
            except socket.error as e:
                print("ERROR:JPyDbg connection failed errno(%s) : %s" % ( e.errno , e.strerror ))
        return self._connected

    def readNetBuffer( self ):
        """ reading on network socket """
        try:
            if ( self._lastBuffer.find('\n') != -1 ):
                return self._lastBuffer ; # buffer stills contains commands
            networkData = self._connections['in'].recv(1024)
            if not networkData:  # capture network interuptions if any
                return None
            data = self._lastBuffer + networkData
            return data
        except socket.error as e:
            print("recv interupted errno(%s) : %s" % ( e.errno , e.strerror )
            return None

Zum Zeitpunkt meiner ersten Meldung befanden sich die zwei veränderten Zeilen auskommentiert noch an ihrer ursprünglichen Position. Ich habe sie mittlerweile entfernt, so dass der Fehler in der jetzigen Zeile 101 (hier im Auszug Zeile 16) auftrat.

Im weiteren Verlauf "rutschte" der Fehler nach unten zur Zeile 115 (hier im Auszug Zeile 30). Dies ist mir nicht aufgefallen, aber an dem von mir weiter oben geposteten Code kann man es an der unterschiedlichen Folgezeile erkennen. Die Zeile mit dem Fehler ist eigentlich in beiden Fällen identisch, weshalb es mir auch nicht aufgefallen ist.

Jetzt ist der Fehler ein weiteres Mal nach unten zur Zeile 117 (im Auszug Zeile 32) "gewandert". Der Code in dieser Zeile unterscheidet sich sehr wohl von den anderen beiden Fehlerstellen.

Was kann für dieses eigentümliche Verhalten ursächlich sein?
Zuletzt geändert von kodela am Donnerstag 17. Dezember 2015, 18:12, insgesamt 2-mal geändert.
eckhard
User
Beiträge: 33
Registriert: Montag 14. Dezember 2015, 10:06
Wohnort: Karlsruhe

Hallo,

kann es sein, dass bei dem print in Zeile 12 bzw. 31 am Ende eine schließende Klammer fehlt?

eckhard
BlackJack

@kodela: Also ist dort mindestens ein Tabulatorzeichen drin wenn da `True` ausgegeben wird. Was wir ja die ganze Zeit sagen: Python wird sich nicht beschweren wenn da ausschliesslich Leerzeichen wären.

Der neue Syntaxfehler dürfte an der fehlenden Klammer liegen wie eckhard ja schon angemerkt hat.
Benutzeravatar
snafu
User
Beiträge: 6908
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

kodela hat geschrieben:Hier das unveränderte Ergebnis auf Deinen Vorschlag:

Code: Alles auswählen

C:\Users\UName\Desktop>python -c "print('\t' in open(r'C:\Users\Rudi\AppData\Roam
ing\NetBeans\8.1\config\nbPython\debug\nbpythondebug\dbgnetwork.py').read())"
True
Das ist ja durchaus eine Veränderung. Denn jetzt wird mittels `True` angezeigt, dass eben doch ein Tab-Zeichen im Quelltext vorhanden ist.

Sofern das Problem noch besteht, kannst du dir folgendermaßen die Zeilen mit Tabs anzeigen lassen:

Code: Alles auswählen

with open('deine_datei.py') as source_file:
    for line_no, line_content in enumerate(source_file, 1):
        if '\t' in line:
            print('{}: {!r}'.format(line_no, line_content))
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

eckhard hat geschrieben:kann es sein, dass bei dem print in Zeile 12 bzw. 31 am Ende eine schließende Klammer fehlt?
Hallo @eckhard:

Das kann nicht sein, das ist so. Danke für diesen Hinweis.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

BlackJack hat geschrieben:@kodela: Also ist dort mindestens ein Tabulatorzeichen drin wenn da `True` ausgegeben wird. Was wir ja die ganze Zeit sagen: Python wird sich nicht beschweren wenn da ausschliesslich Leerzeichen wären.

Der neue Syntaxfehler dürfte an der fehlenden Klammer liegen wie eckhard ja schon angemerkt hat.
Ja, das war so, die fehlende Klammer habe ich offensichtlich "verschludert", als ich den Ausdruck von der 2er- auf die 3er-Syntax geändert habe.

Das mit dem Tabulatorzeichen will ich nicht bestreiten. Es gibt allerdings zwei Gründe, die mir dies extrem unwahrscheinlich erscheinen lassen. Erstens habe ich den Editor so eingestellt, dass man Tabulatorzeichen gut sieht und in der relativ kleine Datei, weniger als 200 Zeilen, sehe ich keinen. Deswegen allein wäre ich mir aber nicht zu 100% sicher. Wenn ich aber diese Datei mit dem Hexeditor öffne und nach dem Hexwert "09" suche, wird dieser nicht gefunden. Gefunden werden aber "0A", "0D" und "20", in anderen Dateien auch "05" oder auch "09".

Auf jeden Fall habe ich mit der fehlenden schließenden Klammer Dank der intensiven Hilfe durch das Forum die Ursache für die angezeigten Syntaxfehler gefunden. Dafür bedanke ich mich bei allen Helfern.

Es geht nun aber für mich weiter- Die nächste Meldung ist:

Code: Alles auswählen

  File "C:\Users\Rudi\AppData\Roaming\NetBeans\8.1\config\nbPython\debug\nbpythondebug\dbgnetwork.py", line 45, in <module>
    import __builtin__
ImportError: No module named '__builtin__'
Aber das suche ich schon selbst, woran das liegt.
Antworten