【问题标题】:ctypes python std::stringctypes python std::string
【发布时间】:2012-03-14 13:39:01
【问题描述】:

我正在使用 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_char_p 发送到将其转换为 std::string 然后立即调用 HandleString 的 C++ 函数不是更有意义吗?事实上,存在从const char*std::string 的隐式转换,因此您的解决方法函数可以只使用指针作为HandleString 的参数表达式。不要费心尝试将 std::string 传回 Python。

标签: c++ python ctypes


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    如果 Python 字符串可以包含空字符,则必须使用 PyString_AsStringAndSize 进行转换,并传递两个值 (char*Py_ssize_t);有一个明确的转换 这些也发给std::stringstd::string( pointer, length )

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-25
      相关资源
      最近更新 更多