>本代码演示了c++调用python的各种参数转换例子,包括字符串,数值,数组,类,list等转换方法
>运行平台:vc2019,python37(64位)
代码下载地址:https://download.csdn.net/download/dcx_dcx/12170359
代码示例如下:
//1. 传送字符串和数据到python函数
void TestF1(void)
{
PyObject* pModule = NULL;
PyObject* pFunc = NULL;
PyObject* pArg = NULL;
pModule = PyImport_ImportModule("demo1"); //注意文件名字大小写
pFunc = PyObject_GetAttrString(pModule, "Hello");//获取函数名称
pArg = Py_BuildValue("(s)", "my is c++ test!"); //一个字符串参数
PyEval_CallObject(pFunc, pArg);//函数调用
pFunc = PyObject_GetAttrString(pModule, "Add"); //两个整形的参数
pArg = Py_BuildValue("(i,i)", 10, 25); // 变量格式转换成python格式
PyEval_CallObject(pFunc, pArg);
}
python文件: demo1.py
def Hello(s):
print("\n=======================")
print("demo1:hello")
print(s)
def Add(a, b):
print("\n=======================")
print("demo1:add")
print("{0}".format(a + b))
///
//2.列表作为参数的传送给python函数
void TestF2(void)
{
PyObject* pModule = NULL;
PyObject* pFunc = NULL;
PyObject* pArg = NULL;
pModule = PyImport_ImportModule("demo2"); //注意文件名字大小写
PyObject* pyFunc_printList = PyObject_GetAttrString(pModule, "printList");//获取函数名称
if (pModule && PyCallable_Check(pyFunc_printList))
{
PyObject* pyParams = PyList_New(0); //初始化一个列表
PyList_Append(pyParams, Py_BuildValue("d", 5));//列表添加元素值浮点数
PyList_Append(pyParams, Py_BuildValue("i", 2));
PyList_Append(pyParams, Py_BuildValue("i", 6));
PyList_Append(pyParams, Py_BuildValue("i", 8));
PyObject* args = PyTuple_New(1); //定义一个python变量
PyTuple_SetItem(args, 0, pyParams);// 变量格式转换成python格式
PyEval_CallObject(pyFunc_printList, args);//函数调用
}
}
python文件:demo2.py
def printList(l):
print("\n=======================")
print("demo2")
print(len(l))
print(l);
/
/
//3.python类的操作
/
void TestF3(void)
{
PyObject* pModule = NULL;
PyObject* pFunc = NULL;
PyObject* pArg = NULL;
PyObject* pClass = NULL;
PyObject* pObject = NULL;
pModule = PyImport_ImportModule("demo3"); //注意文件名字大小写
pClass = PyObject_GetAttrString(pModule, "Person"); //先获取类名
pArg = PyTuple_New(1); // 定义一个变量
PyTuple_SetItem(pArg, 0, Py_BuildValue("s", "Class:Jacky")); // 变量格式转换成python格式
pObject = PyEval_CallObject(pClass, pArg); //根据类名实例化对象
pFunc = PyObject_GetAttrString(pObject, "printName"); //根据对象得到成员函数
PyEval_CallObject(pFunc, NULL);//函数调用
}
python文件:demo3.py
class Person:
def __init__(self, name):
self.name = name
def printName(self):
print("\n=======================")
print("demo3")
print (self.name)
/
/
//4. Python程序返回参数的例子
/
void TestF4(void)
{
PyObject* pModule = PyImport_ImportModule("demo4");//注意文件名字大小写
PyObject* pyFunc_mix = PyObject_GetAttrString(pModule, "mix");
if (pModule && PyCallable_Check(pyFunc_mix))
{
PyObject* pyParams = PyTuple_New(2); //定义两个变量
PyTuple_SetItem(pyParams, 0, Py_BuildValue("i", 5));// 变量格式转换成python格式
PyTuple_SetItem(pyParams, 1, Py_BuildValue("i", 2));// 变量格式转换成python格式
int r1 = 0, r2 = 0;
PyObject* pyValue = PyObject_CallObject(pyFunc_mix, pyParams); //调用函数返回结果
PyArg_ParseTuple(pyValue, "i|i", &r1, &r2);//分析返回的元组值
if (pyValue)
{
printf("%d %d\n", r1, r2);
}
}
}
python文件:demo4.py
def mix(a,b):
print("\n=======================")
print("demo4")
r1 = a + b
r2 = a - b
return (r1, r2)
///
//5.c++数组转python的list
/
void TestF5(void)
{
//以下调用很重要,否则转换中会出现异常
if (_import_array() < 0)
{
PyErr_Print();
PyErr_SetString(PyExc_ImportError, "numpy.core.multiarray failed to import");
}
PyObject* pModule = NULL;
PyObject* pFunc = NULL;
pModule = PyImport_ImportModule("demo5");//注意文件名字大小写
PyObject* pyFunc_printList = PyObject_GetAttrString(pModule, "printList");//获取函数名称
float buf[2][3]; //定义二维数组
buf[0][0] = 0;
buf[0][1] = 1.233;
buf[0][2] = 2.222;
buf[1][0] = 4.222;
buf[1][1] = 5.333;
buf[1][2] = 6.333;
PyObject* pArgs = PyTuple_New(1);
npy_intp dims[2]={2,3}; //定义list的shape
int ND = 2;//指明list的维度
PyObject* pPyArray = PyArray_SimpleNewFromData(ND, dims, NPY_FLOAT, buf); //指明list的维度,shape,数量类型,缓冲区
PyTuple_SetItem(pArgs, 0, pPyArray);//变量转换
PyEval_CallObject(pyFunc_printList, pArgs);//函数调用
}
python文件:demo5.py
def printList(lis):
print("\n=======================")
print("demo5")
print(lis)