gpt4 book ai didi

python - 如何将 PyDict 对象从 C++ 发送到 Python

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:06 26 4
gpt4 key购买 nike

我有一个 C++ 映射,需要将其发送到 Python 脚本进行处理。我想我应该把它放在 PyDict 中然后发送。问题是我的脚本没有正确接收到它

我的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;
}

和我的简单脚本

class TestMap(CLBase):
def __init__(self, c):
self.c = c
pass
def hello(self, s):
print "From python script"
print s

输出是

seting item succeeded
From python script

所以不是像 {"k":3000} 那样打印字典,而是打印一个笑脸

我非常感谢使用默认 python API(使用 python.h)而不是任何其他库的答案

最佳答案

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

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

笑脸只是将字典内存中的任何内容重新解释为字符串。


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

关于python - 如何将 PyDict 对象从 C++ 发送到 Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44048997/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com