如何将char指针传递到C++;来自python的API? 我试图从我的Python代码中调用下面的C++方法: TESS_API TessResultRenderer* TESS_CALL TessTextRendererCreate(const char* outputbase) { return new TessTextRenderer(outputbase); }

如何将char指针传递到C++;来自python的API? 我试图从我的Python代码中调用下面的C++方法: TESS_API TessResultRenderer* TESS_CALL TessTextRendererCreate(const char* outputbase) { return new TessTextRenderer(outputbase); },python,c++,nullpointerexception,ctypes,tesseract,Python,C++,Nullpointerexception,Ctypes,Tesseract,我在如何将指针传递给该方法方面遇到困难: 这条路对吗 textRenderer = self.tesseract.TessTextRendererCreate(ctypes.c_char) 或者我应该做: outputbase = ctypes.c_char * 512 textRenderer = self.tesseract.TessTextRendererCreate(ctypes.pointer(outputbase)) 执行上述操作会产生错误: TypeError: _type_

我在如何将指针传递给该方法方面遇到困难:

这条路对吗

textRenderer = self.tesseract.TessTextRendererCreate(ctypes.c_char)
或者我应该做:

outputbase = ctypes.c_char * 512
textRenderer = self.tesseract.TessTextRendererCreate(ctypes.pointer(outputbase))
执行上述操作会产生错误:

TypeError: _type_ must have storage info

你应该传入一个字符串

例如:

self.tesseract.TessTextRendererCreate('/path/to/output/file/without/extension')
下面是一个带有模拟API的通用示例。在
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;
  }
}
然后,在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!'

传一根绳子对我很管用!但是,对不同方法的调用失败了。我问了一个相关的问题,想知道您是否可以帮助注意,字符串应该只直接传递给
const char*
。如果不是
const
,请使用
ctypes。创建字符串缓冲区(“初始值,或使用整数大小”)
。Python字符串在语义上是不可变的,CPython依赖于此允许在代码对象和属性名称中插入各种字符串。如果一个插入的字符串发生变异,这不仅是数据损坏的问题,而且如果该字符串是dict键,还会中断属性访问和dict查找。
>>> 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!'