我正在使用 C++ 作为后端来使用 ctypes。现在C++中有这样的函数:
void HandleString(std::string something){
...
}
我想知道如何从 python 调用这个函数 - 没有 ctype (c_char_p 显然不能工作)来向这个函数发送字符串参数...
如何解决此问题并将字符串从 Python 传递到 C++(并将参数更改为 char* 某些不是选项)
PS 我可以创建这样的解决方法吗?
听起来最简单的方法是围绕库编写一个精简的 C++ 包装器,其唯一目的是将参数从 Python 重新协商到更复杂的 C++ 类中。
这种方法还有助于解决未来的同类问题,而不会增加 Python 代码或 C++ 代码的任何实际复杂性。
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 )
。
试试这个:
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'))