【问题标题】:boost::python passing argv to C++boost::python 将 argv 传递给 C++
【发布时间】:2014-12-22 21:25:47
【问题描述】:

我有一个 C++ 项目,我想给它一个 python-API - 我提供了一个共享库,用户可以将它导入到他的 python 项目中。 C++ 代码解析 CLI,因此我需要将 C++ 端(来自 python-API)argv 作为 char** 传递,而不是作为列表传递。 有什么建议吗?

【问题讨论】:

  • 您可以使用new char*[PyList_Size(l)] 分配C 数组,并在其中填充Python 字符串的C 副本,每个都使用strdup(PyString_AsString(PyList_GetItem(l, I))) 创建。 boost::python 可能会提供实现这一点的捷径,但这将是一般的想法。
  • Tnx man,但是我对python的C-API不熟悉,也没有完全理解你的解释......如果你有时间并且可以提供一个小代码示例,那就太棒了跨度>
  • 我现在发布了一个答案,其中包含使用纯 Python/C API 实现上述建议的代码。应该很容易适应boost::python 方言,或者您可以保持原样。

标签: python boost command-line-interface boost-python argv


【解决方案1】:

这是一个使用常规 Python/C API 编写的函数(未经测试)。随意适应boost::python 结构:

char **list_to_argv_array(PyObject *lst)
{
  assert (PyList_Check(lst));       // use better error handling here
  size_t cnt = PyList_GET_SIZE(lst);
  char **ret = new char*[cnt + 1];
  for (size_t i = 0; i < cnt; i++) {
    PyObject *s = PyList_GET_ITEM(lst, i);
    assert (PyString_Check(s));     // likewise
    size_t len = PyString_GET_SIZE(s);
    char *copy = new char[len + 1];
    memcpy(copy, PyString_AS_STRING(s), len + 1);
    ret[i] = copy;
  }
  ret[cnt] = NULL;
  return ret;
}

当不再需要数组时,通过delete[]-ing 所有单个成员以及数组本身来释放它。

【讨论】:

  • 很好的答案! TnxAlot
猜你喜欢
  • 2014-02-22
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2011-06-30
  • 2012-05-25
  • 1970-01-01
  • 2019-07-19
  • 1970-01-01
相关资源
最近更新 更多