Unterscheid zwischen Python version mit ctypes

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
ignis-draco
User
Beiträge: 15
Registriert: Freitag 25. Februar 2011, 12:33

Hi

Ich habe folgendes Problem das ich nicht ganz verstehe und bei dem mir google keine Hilfe ist .

Code: Alles auswählen

class objet(ctypes.Structure):
    _fields_=[
    ('name',ctypes.c_char*64),
    ('x',ctypes.c_double),
    ('y', ctypes.c_double),
    ('z', ctypes.c_double)
    ]

#hier nur der ausschnitt von der Funktion 
    positi = objet.from_buffer(myMem.data[pos])
    positi.name = "ball"
Unter Python 3.1.2 Läuft alles super.
Wenn ich aber versuche das Programm unter Python 3.2 laufen zulassen kommt:

Traceback (most recent call last):
File "walknet_main.py", line 47, in <module>
IO.BallBox.loop()
File "Documents/walknet/py/src/IO/BallBox.py", line 123, in loop
controll_ball(1)
File "Documents/walknet/py/src/IO/BallBox.py", line 133, in controll_ball
positi.name = "ball"
TypeError: expected string, str found

Wenn ich das richtig verstehe benötigt er einen String bekommt aber ein str was ja die Python version
von String ist. Wie kann ich es jetzt hinbekommen das ich einen String bekomme und kein str ?

Ich bin etwas erstaund das innerhalb der 3 Version solche Probleme auftauchen.

wäre toll wenn mir jemand einen Tip geben könnte wie ich das Problem Lösen kannn.


Gruß und Danke um vorraus
Ignis-draco
deets

In Python 3 sind alle strings unicode-Objekte. C kennt aber nur byte-strings. Also musst du vorher wandeln, ich denke mal ein name.encode("utf-8") sollte reichen - ich bin aber kein Py3 Nutzer, darum ist das nur geraten.
lunar

@ignis-draco: Diese „Probleme“ existieren per se auch in Python 2, nur eben nicht als Ausnahme, sondern in Form subtiler Fehler, da echte Zeichenketten ("unicode" in Python 2, "str" in Python 3), und Bytefolgen ("str" in Python 2, "bytes" in Python 3) gemischt werden.

Dir muss bei der Arbeit mit Zeichenketten auch in Python 2 immer klar sein, ob es sich um echte Zeichenketten handelt, oder lediglich Bytefolgen, gerade wenn Du mit C-Funktionen arbeitest, die per se nur Bytes verstehen.
ignis-draco
User
Beiträge: 15
Registriert: Freitag 25. Februar 2011, 12:33

Das
deets hat geschrieben:name.encode("utf-8")
hat funktionirt unter 3.2.
Ich hoffe nur das es unter 3.1.2 auch geht. Kann das leider nur gerade nicht testen.
lunar hat geschrieben:Dir muss bei der Arbeit mit Zeichenketten auch in Python 2 immer klar sein, ob es sich um echte Zeichenketten handelt, oder lediglich Bytefolgen, gerade wenn Du mit C-Funktionen arbeitest, die per se nur Bytes verstehen.
Jetzt wird mir das alles klar.

Es hätte auch ein simples

Code: Alles auswählen

b"ball"
getan.


Vielen dank für die Hilfe
Antworten