从Python调用cpp函数时出现分段错误

2024-10-01 17:26:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试从python调用this cpp function

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;
}

此函数的最后一个参数是TessResultRenderer。有another cpp function用于创建TessResultRenderer

^{pr2}$

从python调用这个函数时,我执行了以下操作:

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

但是我一直得到Segmentation fault错误。在

我的问题是如何从Python调用TessBaseAPIProcessPages?在

更多代码库的参考链接:

referer api

Implementation of processPages(...)

编辑

在尝试了注释建议之后,我执行了以下操作,但出现了一个错误: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

Tags: selfapifunctionthisctypescpprenderertesseract
2条回答

这里有一个使用contrib文件夹中ctypes的tesseract C-API的示例。不过,它似乎有点过时了。contrib/tesseract-c_api-demo.py

您需要为一些方法设置restypeargtypes。另外,别忘了在处理程序上调用init函数。下面的例子适用于我。它从一个名为“的文件中读取文本”测试.bmp在英语中输入text变量。在

from ctypes import *
from ctypes.util import find_library

lang = b"eng"
filename = b"test.bmp"
TESSDATA_PREFIX = b"/usr/local/Cellar/tesseract/3.04.01_1/share/tessdata"

path = find_library("libtesseract.dylib")
tesseract = CDLL(path)

class TessBaseAPI(Structure):
    pass
class TessResultRenderer(Structure):
    pass

tesseract.TessBaseAPICreate.restype = POINTER(TessBaseAPI)
tesseract.TessBaseAPIInit3.argtypes = [POINTER(TessBaseAPI), c_char_p, c_char_p]
tesseract.TessBaseAPIInit3.restype = c_bool
tesseract.TessBaseAPIProcessPages.argtypes = [POINTER(TessBaseAPI), c_char_p, c_char_p, c_int, POINTER(TessResultRenderer)]
tesseract.TessBaseAPIProcessPages.restype = c_bool
tesseract.TessBaseAPIGetUTF8Text.argtypes = [POINTER(TessBaseAPI)]
tesseract.TessBaseAPIGetUTF8Text.restype = c_char_p

api = tesseract.TessBaseAPICreate()
rc = tesseract.TessBaseAPIInit3(api, TESSDATA_PREFIX, lang);
if (rc):
    tesseract.TessBaseAPIDelete(api)
    print("Could not initialize tesseract.\n")
    exit(3)

success = tesseract.TessBaseAPIProcessPages(api, filename, None , 0, None)

if success:
    text = tesseract.TessBaseAPIGetUTF8Text(api)
    print("="*78)
    print(text.decode("utf-8").strip())
    print("="*78)

输出如下:

^{pr2}$

编辑:用eryksun建议的不透明类型替换了c_void_p的用法。谢谢!

当您用完一个数组或取消引用空指针时,就会出现分段错误。如果您使用调试器,它将逐步引导您完成所有代码,并向您显示到底发生了什么。在

相关问题 更多 >

    热门问题