Python与C++之间的相互调用实例1

Python与C/C++的最好交互应该是:C++为Python编写扩展模块,Python为C++提供脚本接口。

如果想要在C++的项目中调用Python来丰富功能,也是可以的。本文先来介绍第一种用法。

本来感觉Python与C/C++的相互调用会非常简单【事实也是如此】。但是昨天写的C++调用Python的例子中,出现了让我难以明白的Bug,折腾了很久才明白,Python文件的文件名不能随便起,最好不要用test.py之类的。python自带test模组且优先级高于用户的。

这样就没有问题了。【这里解决了调用问题,后面再讲如何调用数据结构】

/*
// py文件: myTest.py
def Hello():
    print('Hello, world!')
*/

/*
函数查找的时候不成功。 据说需要是32位的Python3.6, 不知道是不是因为这个原因。待查。
查明白了,不是因为这个原因。是Python文件不能起test这样的名字。
*/

extern "C"
{
    #include "Python.h"
}
int main()
{
    Py_Initialize();
    int ret = Py_IsInitialized();
    if (ret == 0)
    {
        printf("Py_IsInitialized = false \r\n");
        return -1;
    }

    PyObject* pModule = PyImport_ImportModule("myTest"); //加载py文件
    if (pModule == NULL)
        printf("pModel = NULL \r\n");
    else
    {
        /*
        // 方法一:直接获取函数
        PyObject* pFunc = PyObject_GetAttrString(pModule, "Hello");
        */

        // 方法二:获取所有的字典表,然后从字典表中获取函数
        PyObject* pDict = PyModule_GetDict(pModule);
        PyObject* pFunc = PyDict_GetItemString(pDict, "Hello");

        // 执行函数
        if (pFunc) { PyEval_CallObject(pFunc, NULL); }
        else { printf("pFunc = NULL \r\n"); }
    }
    // 善后工作
    Py_DECREF(pModule);
    Py_Finalize();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sdust_dx/article/details/80603829