C++ 内嵌 python 例程

#include <Python.h>

int
main(int argc, char *argv[])
{
    PyObject *pName, *pModule, *pDict, *pFunc;	//所有针对python的输入输出对象
    PyObject *pArgs, *pValue;
    int i;

    if (argc < 3) {
        fprintf(stderr,"Usage: call pythonfile funcname [args]\n");
        return 1;
    }

    Py_Initialize(); //python环境初始化
    pName = PyString_FromString(argv[1]);	//char* -> python object
    /* Error checking of pName left out */

    pModule = PyImport_Import(pName);		//导入模块
    Py_DECREF(pName);				//pName后面不用了,解除引用。(在内嵌python代码中,这条要经常用到。)

    if (pModule != NULL) {
        pFunc = PyObject_GetAttrString(pModule, argv[2]);	//获取模块中的函数,第二个参数是char *型
        /* pFunc is a new reference */

        if (pFunc && PyCallable_Check(pFunc)) {	//检测函数是否可用
            pArgs = PyTuple_New(argc - 3);	//新建一个Tuple对象,元素个数确定。
            for (i = 0; i < argc - 3; ++i) {
                pValue = PyInt_FromLong(atoi(argv[i + 3])); //"number" -> number -> py_object(number)
                if (!pValue) {
                    Py_DECREF(pArgs);
                    Py_DECREF(pModule);
                    fprintf(stderr, "Cannot convert argument\n");
                    return 1;
                }
                /* pValue reference stolen here: */
                PyTuple_SetItem(pArgs, i, pValue);	//设定Tuple中元素的值。
            }
            pValue = PyObject_CallObject(pFunc, pArgs);	//Call in python: pFunc(pArgs); then get return value ->pValue;
            Py_DECREF(pArgs);
            if (pValue != NULL) {
                printf("Result of call: %ld\n", PyInt_AsLong(pValue));	//将pyObject返回值转为Integer。

                Py_DECREF(pValue);
            }
            else {
                Py_DECREF(pFunc);
                Py_DECREF(pModule);
                PyErr_Print();
                fprintf(stderr,"Call failed\n");
                return 1;
            }
        }
        else {
            if (PyErr_Occurred())
                PyErr_Print();
            fprintf(stderr, "Cannot find function \"%s\"\n", argv[2]);
        }
        Py_XDECREF(pFunc);	//与Py_DECREF功能相同,允许参数值为NULL。
        Py_DECREF(pModule);
    }
    else {
        PyErr_Print();
        fprintf(stderr, "Failed to load \"%s\"\n", argv[1]);
        return 1;
    }
    Py_Finalize();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值