C++ 内嵌 python 例程
来源:互联网 发布:淘宝店铺靓号申请技巧 编辑:程序博客网 时间:2024/05/19 16:05
#include <Python.h>intmain(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;}