Ich versuche this cpp function von Python zu nennen:Segmentation fault während CPP Funktion von Python Aufruf
TESS_API BOOL TESS_CALL TessBaseAPIProcessPages(TessBaseAPI* handle, const char* filename,
const char* retry_config, int timeout_millisec, TessResultRenderer* renderer)
{
if (handle->ProcessPages(filename, retry_config, timeout_millisec, renderer))
return TRUE;
else
return FALSE;
}
Der letzte Parameter dieser Funktion TessResultRenderer
ist. Es another cpp function ist TessResultRenderer
zum Erstellen Jetzt
TESS_API TessResultRenderer* TESS_CALL TessTextRendererCreate(const char* outputbase)
{
return new TessTextRenderer(outputbase);
}
beim Aufruf aus meiner Python, ich habe folgende:
outputbase = "stdout"
renderer = tesseract.TessTextRendererCreate(outputbase)
text_out = tesseract.TessBaseAPIProcessPages(api,
ctypes.create_string_buffer(path),
None, 0, renderer) //Segmentation fault (core dumped) error on this line
aber ich erhalte immer Segmentation fault
Fehler.
Meine Frage ist, wie kann ich TessBaseAPIProcessPages
von Python?
Einige weitere Referenz-Links in die Code-Basis:
Implementation of processPages(...)
bearbeiten
Nachdem die kommentierten Vorschläge versuchen, habe ich die folgenden, aber ich erhalte eine Fehlermeldung: item 1 in _argtypes_ has no from_param method
PTessResultRenderer = ctypes.POINTER(TessResultRenderer)
self.tesseract.TessTextRendererCreate.restype = PTessResultRenderer
outputbase = "stdout"
self.tesseract.TessTextRendererCreate.argtypes = [outputbase] #error here
self.tesseract.TessTextRendererCreate
ReturnVal = ctypes.c_bool
self.tesseract.TessBaseAPIProcessPages.argtypes = [self.api, path, None, 0, PTessResultRenderer]
self.tesseract.TessBaseAPIProcessPages.restype = ReturnVal
self.tesseracto.TessBaseAPIProcessPages
class TessResultRenderer(ctypes.Structure):
pass
Der Standard-Ergebnistyp ist 'c_int'. Es ist auch der Standardkonvertierungstyp für Integer-Argumente. Lerne, wie man 'artype' und 'artypes' setzt. – eryksun
@eryksun Der Ergebnistyp von 'TessTextRendererCreate' ist' neuer TessTextRenderer'. Ich bin mir der Argentypen bewusst, bin mir aber nicht sicher, wie ich sie hier anwenden soll. – Anthony
Verwenden Sie einen undurchsichtigen Typ: 'class TessResultRenderer (ctypes.Structure): pass '. Erstellen Sie dafür einen Zeigertyp: 'PTessResultRenderer = ctypes.POINTER (TessResultRenderer)'. Setzen Sie dann 'tesseract.TessTextRendererCreate.rrestype = PTessResultRenderer'. – eryksun