c++和Python混合编程

来源:互联网 发布:linux查看centos版本 编辑:程序博客网 时间:2024/05/29 14:28

1. 设置环境

1) 在vs的附加包含目录中添加Python的include路径; 

2) 在vs Linker的附加库目录中添加python的libs路径;

3) 注意,如果安装的python是64位的,那么vs工程也要是一直对应的x64活动平台,否则会报“无法解析的外部符号 __imp__Py_Initialize”等错误

4) 如果没设置pythonpath,需要在调用Py_SetPythonHome()之前,设置python搜索路径,  Py_SetPythonHome("C:\Python27");


2. coding

#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();    }    
上面代码转自:http://www.cnblogs.com/Hisin/archive/2012/02/27/2370590.html

原创粉丝点击