C++之python函数调用
2011-08-26 11:16
204 查看
代码如下,分别演示直接执行python语句、无返回无参数函数调用、返回单参数函数调用。返回多参数函数调用:
//调用一参数函数
//调用多参数函数
习惯C++的内存分配释放,突然间不用释放,感觉很蹊跷,上网查发现也没有释放函数。如果真这样的话,是很可怕的,因为无法自己管理内存,但是我相信编译器作者的垃圾回收机制,所以OK,不管!!
#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,不管!!
相关文章推荐
- C++之python函数调用
- C/C++中调用LUA函数
- NDK开发之c++调用java
- 如何在C++中调用C程序
- unity中C#调用C++
- C++关于子类调用父类的构造方法的问题
- c++调用python找不到py文件的可能原因
- C/C++与汇编的函数相互调用分析
- .net 调用C++类库
- 动态库的建立及C++调用与环境变量的使用
- Java调用C/C++编写的第三方dll动态链接库(非native API)--- JNI
- 详解python如何调用C/C++底层库与互相传值
- Eclipse直接完成JAVA调用C/C++ (Eclipse上使用CDT结合MinGW)
- C++ 调用c#DLL函数
- C++与C#有关对库(动态库dll,静态库.lib)文件的调用
- 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”?
- Android NDK 开发 C++调用java数组 以及方法
- JNI调用c++注意事项
- Boost.Python实现C++与Python互调用
- C++中构造函数调用顺序