Seite 1 von 2
except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 12:26
von kodela
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.
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 12:34
von pillmuncher
@kodela: Google Transelate sagt, "inconsistent use of tabs and spaces in indentation" heißt "inkonsistente Verwendung von Tabulatoren und Leerzeichen in Einkerbung"
Du hast bei der Einrückung Tabs und Leerzeichen gemixt. Am besten du verwendest ausschließlich Leezeichen. NetBeans sollte sich entsprechend konfigurieren lassen.
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 12:52
von kodela
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
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 13:08
von DasIch
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.
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 13:22
von kodela
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.
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 13:57
von cofi
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.
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 14:32
von kodela
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:

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.
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 14:40
von /me
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.
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 14:42
von pillmuncher
@kodela: Wie sehen denn die Zeilen vor dem except aus? Manche Syntaxfehler bemosert Python erst in der darauffolgenden Zeile.
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 14:49
von DasIch
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())'
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 15:03
von kodela
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.
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 15:22
von kodela
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.
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 16:53
von snafu
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.
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 17:59
von kodela
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
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 18:00
von kodela
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?
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 18:06
von eckhard
Hallo,
kann es sein, dass bei dem print in Zeile 12 bzw. 31 am Ende eine schließende Klammer fehlt?
eckhard
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 18:37
von 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.
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 19:01
von snafu
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))
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 19:09
von kodela
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.
Re: except bei Python 2/3
Verfasst: Donnerstag 17. Dezember 2015, 19:50
von kodela
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.