Create_string_buffer throwing error TypError: str / bytes erwartet anstelle von str instance

Ich versuche dieses einfache Ctypes-Beispiel und bekomme den Fehler erwähnt

>>> from ctypes import create_string_buffer >>> str = create_string_buffer("hello") Traceback (most recent call last): File "<stdin>", line 1, in <module> File "C:\Python32\lib\ctypes\__init__.py", line 59, in create_string_buffer buf.value = init TypeError: str/bytes expected instead of str instance 

Weiß jemand was ich falsch mache?

Auf der gleichen Anmerkung versuche ich, einen Zeiger auf einen String zu einer C-Funktion aus meinem Python-Code zu übergeben, damit ich dort einen String-Vorgang ausführen und einen anderen String zurückgeben kann. Kann mir jemand einen Beispielcode geben, wie man das macht?

 extern "C" __declspec(dllexport) char * echo(char* c) { // do stuff return c; } 

3 Solutions collect form web for “Create_string_buffer throwing error TypError: str / bytes erwartet anstelle von str instance”

In Bezug auf es zu arbeiten, wenn Sie es ein bytes Objekt, es funktioniert:

 >>> import ctypes >>> ctypes.create_string_buffer(b'hello') <ctypes.c_char_Array_6 object at 0x25258c0> 

Blick auf den Code für create_string_buffer :

 def create_string_buffer(init, size=None): """create_string_buffer(aBytes) -> character array create_string_buffer(anInteger) -> character array create_string_buffer(aString, anInteger) -> character array """ if isinstance(init, (str, bytes)): if size is None: size = len(init)+1 buftype = c_char * size buf = buftype() buf.value = init return buf elif isinstance(init, int): buftype = c_char * init buf = buftype() return buf raise TypeError(init) 

Es direkt,

 >>> (ctypes.c_char * 10)().value = b'123456789' 

Das geht gut

 >>> (ctypes.c_char * 10)().value = '123456789' Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: str/bytes expected instead of str instance 

Dies zeigt das gleiche Verhalten. Schaut zu mir, als hättest du einen Fehler gefunden.

Zeit zu besuchen http://bugs.python.org . Es gibt ein paar Bugs im Zusammenhang mit c_char und create_string_buffer die sich im selben Feld befinden, aber keiner berichtet, dass es ein str scheitert jetzt (aber es gibt definitive Beispiele, die es verwendet haben, um in Py3K zu arbeiten).

Du benutzt Python 3 und Strings ( str Type) in Python 3 sind Unicode-Objekte. create_string_buffer erstellt C char arrays, so dass Sie ein bytes Objekt übergeben müssen. Wenn Sie ein str Objekt mit einer entsprechenden Codierung codieren, um ein bytes Objekt zu erstellen. Beachten Sie, dass es einen create_unicode_buffer , der auch C- wchar Arrays erzeugt und Python 3 str Objekte enthält.

 Python 3.2.1 (default, Jul 10 2011, 21:51:15) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import ctypes >>> ctypes.create_unicode_buffer('abcd') <ctypes.c_wchar_Array_5 object at 0x00C2D300> >>> ctypes.create_string_buffer(b'abcd') <ctypes.c_char_Array_5 object at 0x00C2D1C0> >>> ctypes.create_string_buffer('abcd'.encode('utf-8')) <ctypes.c_char_Array_5 object at 0x00C2D300> 

In Bezug auf den zweiten Teil Ihrer Frage, möchten Sie die vorhandene Zeichenfolge bearbeiten oder einen ganz neuen String zurückgeben, der auf dem Heap vergeben wird? Wenn das ehemalige, mit create_string_buffer , um eine veränderliche Zeichenfolge an die Funktion zu übergeben und zu create_string_buffer , wird es funktionieren. Hier ist ein einfaches Beispiel, das _strupr () aus der Windows MSVCRT-Bibliothek aufruft:

 Python 3.2.1 (default, Jul 10 2011, 21:51:15) [MSC v.1500 32 bit (Intel)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import ctypes >>> c = ctypes.CDLL('msvcr90.dll') >>> strupr = c._strupr >>> a=ctypes.create_string_buffer(b'abc') >>> strupr.restype=ctypes.c_char_p >>> strupr(a) b'ABC' 

Hinweis Einstellung der restype (Ergebnistyp) der Funktion zu einem c_char_p teilt ctypes mit, den Rückgabewert in ein bytes Objekt umzuwandeln. Beachten Sie auch, dass _strupr einen String an Ort und _strupr konvertiert, so dass ein veränderbarer String-Puffer übergeben werden muss. Passiere nur Python-Byte-Strings zu C-Funktionen, die const char* , da das Modifizieren von Python-Strings direkt über Ctypes ist Bad TM .

Das Argument ist die Größe des Puffers, der für den String benötigt wird, also übergeben Sie ihm die Länge, die der Puffer sein sollte. Es wird ein char-Array dieser Größe erstellen.

 >>> from ctypes import create_string_buffer >>> buf = create_string_buffer(20) >>> buf <ctypes.c_char_Array_20 object at 0x355348> >>> 
  • Konvertieren Sie C-Array von Zeigern in Python-Array von Strukturen
  • Python-Ctypes, die in Zeiger übergeben und Struct Back erhalten
  • Holen Sie sich den Wert eines Cython Zeigers
  • Assembler-Code mit Python ausführen
  • Python ist die beste Programmiersprache der Welt.