c++ 调用 python

来源:互联网 发布:php读取txt文件前字符 编辑:程序博客网 时间:2024/06/16 12:01

1.   新建控制台程序

2.   属性配置




说明:python26_d.lib的获取方式参见上一篇文章。

3.  c++代码

#include <iostream>#include <Python.h>using namespace std;void HelloWorld();void Add();void TestTransferDict();void TestClass();int main(){cout << "Starting Test..." << endl;cout << "HelloWorld()-------------" << endl;HelloWorld();cout << "Add()--------------------" << endl;Add();cout << "TestDict-----------------" << endl;TestTransferDict();cout << "TestClass----------------" << endl;TestClass();system("pause");return 0;}//调用输出"Hello World"函数void HelloWorld(){Py_Initialize();//使用python之前,要调用Py_Initialize();这个函数进行初始化PyObject * pModule = NULL;//声明变量PyObject * pFunc = NULL;//声明变量pModule =PyImport_ImportModule("Test001");//这里是要调用的Python文件名pFunc= PyObject_GetAttrString(pModule, "HelloWorld"); //这里是要调用的函数名PyEval_CallObject(pFunc, NULL); //调用函数,NULL表示参数为空Py_Finalize();//调用Py_Finalize,这个和Py_Initialize相对应的.}//调用Add函数,传两个int型参数void Add(){Py_Initialize();PyObject * pModule = NULL;PyObject * pFunc = NULL;pModule =PyImport_ImportModule("Test001");//Test001:Python文件名pFunc= PyObject_GetAttrString(pModule,"add");//Add:Python文件中的函数名//创建参数PyObject *pArgs = PyTuple_New(2); //函数调用的参数传递均是以元组的形式打包的,2表示参数个数PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", 5));//0---序号i表示创建int型变量PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", 7));//1---序号//返回值PyObject *pReturn = NULL;pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数//将返回值转换为int类型int result;PyArg_Parse(pReturn, "i", &result);//i表示转换成int型变量cout << "5+7 = " << result << endl;Py_Finalize();}//参数传递的类型为字典void TestTransferDict(){Py_Initialize();PyObject * pModule = NULL;PyObject * pFunc = NULL;pModule =PyImport_ImportModule("Test001");//Test001:Python文件名pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名//创建参数:PyObject *pArgs = PyTuple_New(1); PyObject *pDict = PyDict_New(); //创建字典类型变量PyDict_SetItemString(pDict, "Name", Py_BuildValue("s", "WangYao")); //往字典类型变量中填充数据PyDict_SetItemString(pDict, "Age", Py_BuildValue("i", 25)); //往字典类型变量中填充数据PyTuple_SetItem(pArgs, 0, pDict);//0---序号将字典类型变量添加到参数元组中//返回值PyObject *pReturn = NULL;pReturn = PyEval_CallObject(pFunc, pArgs);//调用函数//处理返回值:int size = PyDict_Size(pReturn);cout << "返回字典的大小为: " << size << endl;PyObject *pNewAge = PyDict_GetItemString(pReturn, "Age");int newAge;PyArg_Parse(pNewAge, "i", &newAge);cout << "True Age: " << newAge << endl;Py_Finalize();}//测试类void TestClass(){Py_Initialize();PyObject * pModule = NULL;PyObject * pFunc = NULL;pModule =PyImport_ImportModule("Test001");//Test001:Python文件名pFunc= PyObject_GetAttrString(pModule, "TestDict"); //Add:Python文件中的函数名//获取Person类PyObject *pClassPerson = PyObject_GetAttrString(pModule, "Person");//创建Person类的实例PyObject *pInstancePerson = PyInstance_New(pClassPerson, NULL, NULL);//调用方法PyObject_CallMethod(pInstancePerson, "greet", "s", "Hello Kitty"); //s表示传递的是字符串,值为"Hello Kitty"Py_Finalize();}


4. python代码

#Test001.py  def HelloWorld():      print "Hello World"  def add(a, b):      return a+b  def TestDict(dict):      print dict      dict["Age"] = 17      return dict  class Person:      def greet(self, greetStr):          print greetStr  #print add(5,7)  #a = raw_input("Enter To Continue...")



说明:以上代码来自http://www.cnblogs.com/Hisin/archive/2012/02/27/2370590.html,感谢原作者!

经过本人验证,代码完全正确。

注意:当python代码有错误时,PyImport_ImportModule函数返回NULL;


2 0
原创粉丝点击