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.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

kodela hat geschrieben: 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".
Wenn Python diesen Fehler aber meldet, dann bleiben nur zwei Alternativen: Entweder ist da ein Durcheinander von Tabulatoren und Spaces, oder der Interpreter hat einen Bug. Letzteres ist (insbesondere an so einer Stelle) ziemlich unwahrscheinlich. Bleibt die andere Möglichkeit, dass die Datei eben doch nicht so korrekt ist, wie Du vermutest.

Die Sache ist doch ganz einfach zu lösen: Zippe das ganze und stell uns das Archiv zur Verfügung! Damit können wir selber die Datei untersuchen oder gar ausführen, wenn es keine unmöglichen Abhängigkeiten gibt ;-)

Außerdem gibt es ja noch andere Interpreter als CPython - wenn die auch diesen Fehler melden, wird es noch unwahrscheinlicher, dass die Schuld am Interpreter liegt!

Last but not least: Wie oft ist es mir schon passiert, dass ich auf Teufel komm raus an der *falschen* Datei herum gedoktert habe und mich gewundert habe, *wieso* sich keine Besserung einstellt. Das ist keine Schande und kann Dir ja ggf. auch passieren.

Wenn Du Alfons Mittelmeier wärst, stünde noch zu vermuten, dass Du zur Laufzeit am Script selber herumschraubst, so dass das Chaos danach nicht mehr zu sehen ist :twisted: SCNR
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

kodela hat geschrieben:Das mit dem Tabulatorzeichen will ich nicht bestreiten. Es gibt allerdings zwei Gründe, die mir dies extrem unwahrscheinlich erscheinen lassen.
Mag sein, aber suche es doch erst einmal. Das hilft.
BlackJack

@kodela: Das ist nicht extrem unwahrscheinlich sondern da ist 99,9999999%ig mindestens ein Tabulatorzeichen drin wenn der Python-Compiler meckert *und* der Test auf ein Tabulatorzeichen 'True' ausgibt. Dann noch zu behaupten da wäre keins ist ziemlich verwegen. ;-)
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @Hyperion:

Mittlerweile bin ich einen Schritt weiter bei der Anpassung der Dateien. import __builtin__ habe ich durch import builtins ersetzt. Damit wird auch dieses Modul gefunden. Und nun wird über den Kommandozeilenstring

Code: Alles auswählen

D:\Python35\python -c "print('\t' in open(r'C:\Users\UName\AppData\Roaming\NetBeans\8.1\config\nbPython\debug\nbpythondebug\Dateiname.py').read())"
in keiner der drei unmittelbar betroffenen Dateien ein Tabzeichen gefunden (Ausgabe 'False').

Ich habe übrigens nie zur Laufzeit an irgend einer Datei etwas gemacht. Im Gegenteil, ich habe sogar vor jeder Änderung NetBeans herunter gefahren, die Änderung durchgeführt, gespeichert und NetBeans mit dem Projekt neu gestartet.

Du hast angeboten, das ganze Archiv zu prüfen. Ich denke, das hat sich jetzt erledigt. Bei den weiteren Fehlermeldungen muss ich mich wohl selbst durchbeißen, denn eine Prüfung würde ja ein installiertes NetBeans 8.1 voraussetzen. Es geht nur um das Debuggen, das mit Python 2.x sehr gut funktioniert, nur eben mit 3.x nicht.

Die Version 3.5 habe ich mir eigentlich nur installiert, weil ich ein relativ einfaches Beispielprojekt für die Einbindung des VLC Mediaplayers unter Python in eine tkinter-GUI habe, das allerdings die Python Version 3.4 voraussetzt. Da ich mich einerseits recht gut mit dem VLC auskenne und andererseits mich in Python ein wenig einarbeiten möchte, dachte ich, dieses Projekt eigne sich gut dafür.

Nur noch der letzte Fehlerbericht. Vielleicht fällt ja jemand dazu etwas ein:

Code: Alles auswählen

c:\users\UName\appdata\roaming\netbeans\8.1\config\nbpython\debug\nbpythondebug\jpydaemon.py
args =  ['C:\Users\UName\AppData\Roaming\NetBeans\8.1\config\nbPython\debug\nbpythondebug\jpydaemon.py', 'localhost', '29100']
localDebuggee= None
JPyDbg connecting  localhost  on in=  29100 /out= 29101
Traceback (most recent call last):
  File "C:\Users\UName\AppData\Roaming\NetBeans\8.1\config\nbPython\debug\nbpythondebug\jpydaemon.py", line 1600, in <module>
    debuggeeArgs=sys.argv
  File "C:\Users\UName\AppData\Roaming\NetBeans\8.1\config\nbPython\debug\nbpythondebug\jpydaemon.py", line 1543, in start
JPyDbgI0001 : connected to  localhost
Debug session Abort =1
    self._connection.populateXmlToClient( welcome )
  File "C:\Users\UName\AppData\Roaming\NetBeans\8.1\config\nbPython\debug\nbpythondebug\dbgnetwork.py", line 158, in populateXmlToClient
    self._send( mbuffer )
  File "C:\Users\UName\AppData\Roaming\NetBeans\8.1\config\nbPython\debug\nbpythondebug\dbgnetwork.py", line 143, in _send
    self._connections['out'].send( buffer )
TypeError: a bytes-like object is required, not 'str'
Hallo @BlackJack:

Eben sehe ich, dass Du zwischenzeitlich etwas geschrieben hast, wobei es auch um das Tabulatorzeichen geht. Ich konnte es mir nicht vorstellen, aber behauptet, dass kein Tabulatorzeichen in einer der Dateien wäre, behauptet habe ich das nicht. Das war meine Aussage:
Das mit dem Tabulatorzeichen will ich nicht bestreiten. Es gibt allerdings zwei Gründe, die mir dies extrem unwahrscheinlich erscheinen lassen.
Mir ist es extrem unwahrscheinlich erschienen. Ich weiß nicht, wie es Dir ginge, wenn Du eine solche Datei mit einem Hexeditor überprüfst und der findet keines. Fakt ist aber, dass Python bei der Suche über die Kommandozeile zumindest eines gefunden haben muss.

Danke allen, kodela
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

kodela hat geschrieben:import __builtin__ habe ich durch import builtins ersetzt. Damit wird auch dieses Modul gefunden. Und nun wird über den Kommandozeilenstring ... in keiner der drei unmittelbar betroffenen Dateien ein Tabzeichen gefunden (Ausgabe 'False').
Dann war der Tabulator vermutlich dort verborgen. Das builtin-Modul brauchst Du nicht zu importieren, denn dieser Namespace ist stets erreichbar. Es sei denn, Du überschreibst dort definierte Funktionen, möchtest aber weiterhin auch auf die überschriebenen Funktionen zugreifen können.
kodela hat geschrieben:Nur noch der letzte Fehlerbericht. Vielleicht fällt ja jemand dazu etwas ein: TypeError: a bytes-like object is required, not 'str'
Das ist ein typisches Python 3 Ding: der buffer ist vermutlich ein String, was in Python 2 funktioniert. In Python 3 ist es dagegen ein Unicode-String, der zuvor in einen Byte-String konvertiert werden muss.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo @kbr:

Danke für Deine Hinweise. buffer habe ich jetzt einmal mit buffer.encode(encoding="utf-8") konvertiert. Damit bekomme ich den neuen Fehler:

Code: Alles auswählen

  File "C:\Users\Rudi\AppData\Roaming\NetBeans\8.1\config\nbPython\debug\nbpythondebug\dbgnetwork.py", line 112, in readNetBuffer
    data = self._lastBuffer + networkData
TypeError: Can't convert 'bytes' object to str implicitly
So sieht die Funktion aus, in der vor dem return data (hier Zeile 9) der Fehler auftritt:

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
Ich gehe davon aus, dass dieser Fehler mit der vorgenommenen Änderung zusammenhängt. Was schlägst Du vor? Sollte ich eventuell das komplette Skript posten, es sind nur rund 150 Zeilen?
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

kodela hat geschrieben:Ich gehe davon aus, dass dieser Fehler mit der vorgenommenen Änderung zusammenhängt.
Davon gehe ich nicht aus, sondern davon, dass 'self._lastBuffer' von Typ 'str' ist. Für 'networkData' gilt dies nicht und Python vermeldet, dass es keine implizite Typumwandlung vornimmt. Was richtig ist, denn welches codec sollte zur Anwendung kommen? Vielleicht möchtest Du Dir zum Thema 'buffer' das io-Modul ansehen.
BlackJack

Noch 'ne Anmerkung zum `__builtin__`/`builtins`: Überschreiben von eingebauten Namen sollte man schlicht vermeiden statt diese Module zu importieren.
kodela
User
Beiträge: 185
Registriert: Montag 12. Oktober 2015, 21:24
Wohnort: Landsberg am Lech
Kontaktdaten:

Hallo,

danke allen, die mir geholfen haben. Ich habe es mittlerweile aufgegeben, Python-Skripte mit NetBeans zu debuggen und bin auf PyCharm umgestiegen. Diese Umgebung ist mir zwar neu, aber ihre spezielle Anpassung für Python hat doch viele Vorteile, die den Vorteil meiner Vertrautheit mit NetBeans eindeutig aufwiegen.

MfG, kodela
Antworten