c++ 如何调用 python

455 阅读2分钟

C++怎么向Python传递参数

C++向Python传参数是以元组(tuple) 的方式传过去的,因此我们实际上就是构造一个合适的Python元组就可以了,要用到PyTuple_New,Py_BuildValue,PyTuple_SetItem等几个函数

1.	PyObject* pyParams = PyTuple_New(2);
	PyObject* pyParams1= Py_BuildValue("i",5);
	PyObject* pyParams2= Py_BuildValue("i",6);
	PyTuple_SetItem(pyParams,0, pyParams1);
	PyTuple_SetItem(pyParams,1, pyParams2);
2.	PyObject* args = PyTuple_New(2);  //Return a new tuple object of size 2
	PyTuple_SetItem(args, 0, Py_BuildValue("i", 5));//参数一设为int,5
	PyTuple_SetItem(args, 1, Py_BuildValue("i", 6));//参数二设为int,6

也可以直接使用PyObject* Py_BuildValue(char *format, ...) 函数来直接来构造tuple,此函数的使用也很简单,记住一些转换的格式常量即可轻松进行转换(格式常量有点类似printf,参考[9])。譬如s 表示字符串,i表示整型变量,f表示浮点数,o表示一个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))

1.9 The Py_BuildValue() Function

C++怎么转换Python的返回值

Python传回给C++的都是PyObject对象,因此可以调用Python里面的一些类型转换API来把返回值转换成C++里面的类型

类似PyInt_AsLong,PyFloat_AsDouble这些系列的函数。Python比较喜欢传回一个元组,可以使用PyArg_ParseTuple这个函数来解析(用来判断返回值是否设计要求) 。这个函数也要用到上面的格式常量(参考[10])。还有一个比较通用的转换函数是PyArg_Parse,也需要用到格式常量,够不够强大,用了就知道了。

【10】1.7 Format Strings for PyArg_ParseTuple()