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

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;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值