ctypes python std::string

ctypes python std::string

本文关键字:string std python ctypes      更新时间:2023-10-16

我正在使用 C++ 作为后端的 ctypes。现在C++中有这样的函数:

void HandleString(std::string something){
   ...
}

我想知道如何从 python 调用这个函数 - 没有 ctype(c_char_p显然不起作用(向这个函数发送字符串参数......

我如何解决这个问题并将字符串从 Python 传递到 c++(并将参数更改为 char* 某些东西不是和选项(

PS我可以创建这样的解决方法吗?

  1. 将 Python 字符串作为c_char_p发送到将 char* 转换为 std::string 的函数C++
  2. 以某种方式返回字符串或其指针???!!(如何?到蟒蛇
  3. 将其从python发送到HandleString函数(但再次我觉得我必须在此处将参数更改为字符串*(
听起来最简单的

方法是在库周围编写一个薄的 c++ 包装器,其唯一目的是将参数从 python 重新协商到更复杂的 c++ 类。

这种方法也将有助于解决未来同类问题,而不会给 python 代码或 c++ 代码增加任何真正的复杂性。

Python

C API 将 Python str 对象转换为 char* ,然后是从char*(实际上是char const*(的C++隐式转换到std::string.

如果 Python 字符串可以包含空字符,则必须使用 PyString_AsStringAndSize转换,并传递两个值(char*Py_ssize_t(;有一个显式转换这些也要std::stringstd::string( pointer, length ) .

std::string 的内存布局取决于库、平台和架构。下面的代码适用于 Windows 上使用 Visual C++ 的 64 位 DLL 构建。如果不工作,则需要调整 StdString 结构。祝你好运!

def createStdStringObj(s):
    # Structure that represents the memory layout of std::string
    # that depends on library, platform and architecture used.
    # The layout works for a 64 bit DLL build with Visual C++
    # on Windows, adapt it if it is not working!
    class StdString(Structure):
        _fields_ = [
            ("data", c_char_p),         # Pointer to character data
            ("size", c_size_t),         # Size of the string
            ("capacity", c_size_t),     # Capacity of the string
        ]
    data = s.encode("utf-8")
    stds = StdString()
    stds.data = c_char_p(data)
    stds.size = len(data)
    stds.capacity = len(data)
    return stds
dllFcn(createStdStringObj('this is it'))