2016-04-26 10 views
4

Ich versuche, die folgende C++ Methode von meinem Python-Code zu nennen:Wie übergeben Sie Char-Zeiger von Python auf C++ API?

TESS_API TessResultRenderer* TESS_CALL TessTextRendererCreate(const char* outputbase) 
{ 
    return new TessTextRenderer(outputbase); 
} 

ich Schwierigkeiten habe, mit wie den Zeiger auf die Methode zu übergeben:

Ist nach dem richtigen Weg?

textRenderer = self.tesseract.TessTextRendererCreate(ctypes.c_char) 

oder sollte ich tun:

outputbase = ctypes.c_char * 512 
textRenderer = self.tesseract.TessTextRendererCreate(ctypes.pointer(outputbase)) 

oben gibt mir Fehler Doing:

TypeError: _type_ must have storage info 

Antwort

3

Sie sollten in einem String übergeben werden.

Zum Beispiel:

self.tesseract.TessTextRendererCreate('/path/to/output/file/without/extension') 

Hier ist ein allgemeines Beispiel mit einem Mock-API. In lib.cc:

#include <iostream> 

extern "C" { 
    const char * foo (const char * input) { 
    std::cout << 
     "The function 'foo' was called with the following " 
     "input argument: '" << input << "'" << std::endl; 

    return input; 
    } 
} 

Kompilieren Sie die gemeinsam genutzte Bibliothek mit:

clang++ -fPIC -shared lib.cc -o lib.so 

Dann in Python:

>>> from ctypes import cdll, c_char_p 
>>> lib = cdll.LoadLibrary('./lib.so') 
>>> lib.foo.restype = c_char_p 
>>> result = lib.foo('Hello world!') 
The function 'foo' was called with the following input argument: 'Hello world!' 
>>> result 
'Hello world!' 
+0

in einem String Passing arbeitete für mich! Die Aufrufe von verschiedenen Methoden schlagen jedoch fehl. Ich fragte eine verwandte Frage und fragte mich, ob Sie http://stackoverflow.com/questions/36871072/segmentation-fault-while-calling-cpp-function-from-python – Anthony

+1

Beachten Sie, dass eine Zeichenfolge sollte nur direkt übergeben werden 'const char *'. Wenn es nicht "const" ist, benutze 'ctypes.create_string_buffer ('initial value, oder benutze eine ganze Zahl')'. Python-Strings sind semantisch unveränderbar, und CPython hängt davon ab, um verschiedene Strings in Code-Objekten und Attributnamen zu internieren. Wenn ein internierter String mutiert wird, ist dies nicht nur eine Frage der Datenbeschädigung, sondern auch des Attributzugriffs und der dict-Suche, wenn die Zeichenfolge ein dict-Schlüssel ist. – eryksun

Verwandte Themen