Py_BuildValue()函数

C++对应python数据类型 

PyObject_CallMethod(pClass, “class_method”, “O”, pInstance)
参数分别为 PyObject(类),string(类方法),string(O表示参数为PyObject) ,PyObject(类实例)

PyObject_CallFunction(pFun, “O”, pyores)
参数分别为 PyObject(函数),string(O表示参数为PyObject) ,PyObject(函数中使用的参数)

问题来了,函数有多个参数怎么办,参数怎么传递?别担心,有多少个我们就写多少个:
PyObject_CallFunction(pFun, “OO…O”, PyObject 1,PyObject 2…PyObject n)
中间的O可替换成参数类型说明符中的任意一个,比如字符串s,int型变量i等等

创建一个元组
PyObject *pArgs = PyTuple_New(3);
PyTuple_SetItem(pArgs, 0, Py_BuildValue(“i”, 1));//0—序号 i表示创建int型变量
PyTuple_SetItem(pArgs, 1, Py_BuildValue(“i”, 2));
PyTuple_SetItem(pArgs, 2, Py_BuildValue(“i”, 3));

PyEval_CallObject(pFunc, pArgs); //调用函数,pArgs元素个数与被调函数参数个数一致

PyObject *pDict = PyDict_New(); //创建字典类型变量
PyDict_SetItemString(pDict, “Name”, Py_BuildValue(“s”, “Zhangsan”)); //往字典类型变量中填充数据
PyDict_SetItemString(pDict, “Address”, Py_BuildValue(“s”, “BeiJing”));

将上述字典赋值给元组
PyObject *pArgs = PyTuple_New(1);
PyTuple_SetItem(pArgs, 0, pDict)

python返回给C++的是PyObject类型,如果我想在纯C++程序里使用它怎么办:(可以使用下面这个函数
char * PyString_AsString(PyObject*)

利用上面的几个基本参数传递方法,已经可以创建灵活性较强的C++/python程序

Py_BuildValue("")  None

Py_BuildValue("i", 123)  123

Py_BuildValue("iii", 123, 456, 789)  (123, 456, 789)

Py_BuildValue("s", "hello")  'hello'

Py_BuildValue("ss", "hello", "world")  ('hello', 'world')

Py_BuildValue("s#", "hello", 4) 'hell'

Py_BuildValue("()")  ()

Py_BuildValue("(i)", 123)  (123,)

Py_BuildValue("(ii)", 123, 456) (123, 456)

Py_BuildValue("(i,i)", 123, 456) (123, 456)

Py_BuildValue("[i,i]", 123, 456) [123, 456] 

Py_BuildValue("{s:i,s:i}", "abc", 123, "def", 456) {'abc': 123, 'def': 456}

Py_BuildValue("((ii)(ii)) (ii)", 1, 2, 3, 4, 5, 6) (((1, 2), (3, 4)), (5, 6))

https://blog.csdn.net/yiyouxian/article/category/6324494

发布了142 篇原创文章 · 获赞 14 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_30460949/article/details/103087392
今日推荐