万星星@豌豆荚 欢迎加入我们
一个吃软饭的男人!!!!!我只想写程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  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 2005-12-31 18:49 万连文 阅读(1856) 评论(0)  编辑 收藏 引用 所属分类: 乱七八糟

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


简历下载
联系我

<2005年12月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(66)

随笔分类

随笔档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜