C++ 调用Python模块

作者: 云谁之殇 | 来源:发表于2018-09-27 13:44 被阅读1次

    [TOC]

    环境

    VS2013
    Python27_x86

    步骤

    1、引入头文件和库

    将Python安装目录下的includelibs文件夹引入到项目中
    libs目录下的python27.lib复制一份为python27_d.lib

    2、测试脚本

    Python脚本如下

    def Hello():
        print("Hello")
        
    def Add(a,b):
        return  a+b
    
    3、调用Python脚本
    #include "include/Python.h" 
     //..............
    
    Py_Initialize();              //初始化,创建一个Python虚拟环境
    if (Py_IsInitialized())
    {
        PyObject* pModule = NULL;
        PyObject* pFunc = NULL;
        pModule = PyImport_ImportModule("test_python");  //参数为Python脚本的文件名
        if (pModule)
        {
            pFunc = PyObject_GetAttrString(pModule, "Hello");   //获取函数
            PyEval_CallObject(pFunc, NULL);           //执行函数
        }
        else
        {
            printf("导入Python模块失败...\n");
        }
    }
    else
    {
        printf("Python环境初始化失败...\n");
    }   
    Py_Finalize()
    
    4、传递参数及返回结果
    int Test_Add(int a, int b)
    {
        Py_Initialize();
        PyObject* pModule = NULL;
        PyObject* pFunc = NULL;
        pModule = PyImport_ImportModule("test_python");
        pFunc = PyObject_GetAttrString(pModule, "Add");
    
        PyObject* pArgs = PyTuple_New(2);  //以Tuple的形式传递参数,参数名为需要传递的参数的个数
        PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", a));  //i 表示 int类型, 0 表示第一个参数
        PyTuple_SetItem(pArgs, 1, Py_BuildValue("i", b));
        //以上几句 也可写为:
        //PyObject* pArgs = Py_BuildValue("ii", a, b);
        PyObject* pReturn = NULL;
        pReturn = PyEval_CallObject(pFunc, pArgs);
        int nResult;
        PyArg_Parse(pReturn, "i", &nResult);       //返回值,转为int
        return nResult;
    }
    
    5、打包运行

    客户电脑上可不再安装Python环境,需要将Python安装目录下的LibDlls放到程序运行目录下,并添加Python27.dll到运行目录即可。Python27.dll可通过编译Python源码或系统目录或通过py2exe生成的运行程序目录下获得。

    运行目录
    6、Python与C++类型转换
    Format Code Python Type C/C++ Type
    s str char*
    z str/None char*/NULL
    i int int
    l long long
    c str char
    d float double
    D complex Py_Complex*
    O (any) Py_Object*
    S str PyStringObject

    相关文章

      网友评论

        本文标题:C++ 调用Python模块

        本文链接:https://www.haomeiwen.com/subject/fmtkrftx.html