ctypes python std::string

问题描述 投票:0回答:3

我正在使用 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. 以某种方式返回字符串或其指针???!! (如何?)到Python
  3. 将其从 python 发送到 HandleString 函数(但我再次觉得我必须在此处将参数更改为 string* )
c++ python ctypes
3个回答
4
投票

听起来最简单的方法是围绕库编写一个精简的 C++ 包装器,其唯一目的是将参数从 Python 重新协商到更复杂的 C++ 类中。

这种方法还有助于解决未来的同类问题,而不会增加 Python 代码或 C++ 代码的任何实际复杂性。


3
投票

Python C API 将 Python

str
对象转换为
char*
,并且有 是 C++ 中从
char*
(实际上是
char const*
)的隐式转换 到
std::string

如果 Python 字符串可以包含空字符,则必须使用

PyString_AsStringAndSize
进行转换,并传递两个值 (
char*
Py_ssize_t
);有一个显式转换 这些也到
std::string
std::string( pointer, length )


0
投票

试试这个:

def createStdStringObj(s):
    # C structure that represents the memory layout of std::string
    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'))
© www.soinside.com 2019 - 2024. All rights reserved.