随笔-208  评论-469  文章-30  trackbacks-0



代码如下,分别演示直接执行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,不管!!

代码下载

posted on 2006-01-17 20:04 EricWong 阅读(664) 评论(1)  编辑  收藏 所属分类: C&C++

评论:
# re: C++之python函数调用 2007-09-04 17:39 | 金庆
应该调用Py_DECREF()释放内存,
例如:
Py_DECREF(pMod);

不然Python不会进行垃圾回收,因为它看到对象仍被引用。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: