C++之python函数调用

 

代码如下,分别演示直接执行python语句、无返回无参数函数调用、返回单参数函数调用。返回多参数函数调用:
 

 #include <Python.h>
  #include <iostream>
  using namespace std;
  //执行python命令
  void ExecPythonCommand()
  {
  //直接执行 

  PyRun_SimpleString("from time import time,ctime\n"
  "print 'Today is',ctime(time())\n");
  }
  //调用无参数函数
  void InvokeNoParm()
  {
  PyObject* pMod = NULL;
  PyObject* pFunc = NULL;
  //导入模块
  pMod = PyImport_ImportModule("Life");
  if(pMod)
  {
  //获取函数地址
  pFunc = PyObject_GetAttrString(pMod, "a");
  if(pFunc)
  {
  //函数调用
  PyEval_CallObject(pFunc, NULL);
  }
  else
  {
  cout << "cannot find function a" << endl;
  }
  }
  else
  {
  cout << "cannot find Life.py" << endl;
  }
  }


  //调用一参数函数
 

 void InvokeWith1Parm()
  {
  PyObject* pMod = NULL;
  PyObject* pFunc = NULL;
  PyObject* pParm = NULL;
  PyObject* pRetVal = NULL;
  int   iRetVal = 0;
  //导入模块
  pMod = PyImport_ImportModule("FuncDef");
  if(pMod)
  {
  pFunc = PyObject_GetAttrString(pMod, "square");
  if(pFunc)
  {
  //创建参数
  pParm = Py_BuildValue("(i)", 5);
  //函数调用
  pRetVal = PyEval_CallObject(pFunc, pParm);
  //解析返回值
  PyArg_Parse(pRetVal, "i", &iRetVal);
  cout << "square 5 is: " << iRetVal << endl;
  }
  else
  {
  cout << "cannot find function square" << endl;
  }
  }
  else
  {
  cout << "cannot find FuncDef.py" << endl;
  }
  }


//调用多参数函数

 void InvokeWith2Parm()
  {
  PyObject* pMod = NULL;
  PyObject* pFunc = NULL;
  PyObject* pParm = NULL;
  PyObject* pRetVal = NULL;
  int   iRetVal = 0;
  //导入模块
  pMod = PyImport_ImportModule("add");
  if(pMod)
  {
  pFunc = PyObject_GetAttrString(pMod, "add");
  if(pFunc)
  {
  //创建两个参数
  pParm = PyTuple_New(2);
  //为参数赋值
  PyTuple_SetItem(pParm, 0, Py_BuildValue("i",2000));
  PyTuple_SetItem(pParm, 1, Py_BuildValue("i",3000));
  //函数调用
  pRetVal = PyEval_CallObject(pFunc, pParm);
  //解析返回值
  PyArg_Parse(pRetVal, "i", &iRetVal);
  cout << "2000 + 3000 = " << iRetVal << endl;
  }
  else
  {
  cout << "cannot find function square" << endl;
  }
  }
  else
  {
  cout << "cannot find add.py" << endl;
  }
  }

 

 int main(int argc, char* argv[])
  {
  Py_Initialize(); //python 解释器的初始化
  ExecPythonCommand();
  InvokeNoParm();
  InvokeWith1Parm();
  InvokeWith2Parm();
  Py_Finalize();  // 垃圾回收、清除导入库
  return 0;
  }




   习惯C++的内存分配释放,突然间不用释放,感觉很蹊跷,上网查发现也没有释放函数。如果真这样的话,是很可怕的,因为无法自己管理内存,但是我相信编译器作者的垃圾回收机制,所以OK,不管!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值