如何将pyDIt对象从C++发送到Python

2024-10-02 10:23:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个c++映射,需要发送到python脚本进行处理。我想我应该把它放进皮迪克特然后再寄出去。问题是我的脚本没有正确接收它

我的c++

#include <Python.h>
#include <string>

int main(int argc, char *argv[]) {
  Py_Initialize();

  PyObject *import, *attr, *instance, *methodcall, *arg, *tuple;
  PySys_SetPath("./py/");
  import = PyImport_ImportModule("class_test");
  attr = PyObject_GetAttrString(import, "TestMap");
  arg = PyString_FromString("arg from first");
  tuple = PyTuple_Pack(1, arg);
  instance = PyInstance_New(attr, tuple, NULL);

  PyObject *d = PyDict_New();
  PyDict_SetItemString(d, "k", PyInt_FromLong(3000)) ? printf("seting item failed\n") : printf("seting item succeeded\n");

  methodcall = PyObject_CallMethod(instance, "hello", "s", d);

  Py_DECREF(instance);
  Py_Finalize();
  return 0;
}

还有我的简单脚本

^{pr2}$

输出是

seting item succeeded
From python script
☺

因此,与其打印字典,不如打印一张笑脸

如果您能给出一个使用默认python API(使用python.h)而不是任何其他库的答案,我将不胜感激


Tags: instancepyimport脚本newincludeargitem
1条回答
网友
1楼 · 发布于 2024-10-02 10:23:17
methodcall = PyObject_CallMethod(instance, "hello", "s", d);

使用"s"你告诉它参数是一个char*,但实际上它是一个字典(a PyObject*)。如果使用"O",它将被正确解释为PyObject*PyObject_CallMethod的格式字符串被解释为Py_BuildValue,因此记录了here。在

笑脸只是对dict记忆中的字符串的重新解释。在


除此之外,您还应该检查Python API函数的返回值(NULL通常表示错误),并且看起来有一些PyObject你从未减少过,因此您正在泄漏内存。在

相关问题 更多 >

    热门问题