本文共 1738 字,大约阅读时间需要 5 分钟。
Python/CAPI简介
通过C++调用Python脚本主要要用到如下的一些Python提供的API,因为实际上C++要调用的是Python的解释器,而Python解释器本质就是实现在动态链接库里面的,因此在调用前和调用后要进行一些初始化和资源释放的工作,另外,要调用Python脚本里面的函数等等东西,需要Python提供的一些特殊API来包装C++调用。
void Py_Initialize(void)
初始化Python解释器,如果初始化失败,继续下面的调用会出现各种错误,可惜的是此函数没有返回值来判断是否初始化成功,如果失败会导致致命错误。
int Py_IsInitialized(void)
检查是否已经进行了初始化,如果返回0,表示没有进行过初始化。
void Py_Finalize()
反初始化Python解释器,包括子解释器,调用此函数同时会释放Python解释器所占用的资源。*int PyRun_SimpleString(const char command)
实际上是一个宏,执行一段Python代码。
PyObject PyImport_ImportModule(char name)
导入一个Python模块,参数name可以是*.py文件的文件名。类似Python内建函数import。
PyObject PyModule_GetDict( PyObject module)
相当于Python模块对象的__dict__*属性,得到模块名称空间下的字典对象。
PyObject PyRun_String(const char str, int start,PyObject* globals, PyObject* locals)**
执行一段Python代码。
int PyArg_Parse(PyObject args, char format, …)**
把Python数据类型解析为C的类型,这样C程序中才可以使用Python里面的数据。
PyObject PyObject_GetAttrString(PyObject o, charattr_name)*
返回模块对象o中的attr_name 属性或函数,相当于Python中表达式语句,o.attr_name。
PyObject Py_BuildValue(char format, …)**
和PyArg_Parse刚好相反,构建一个参数列表,把C类型转换为Python对象,使得Python里面可以使用C类型数据。
PyObject PyEval_CallObject(PyObject pfunc, PyObject*pargs)**
此函数有两个参数,而且都是Python对象指针,其中pfunc是要调用的Python 函数,一般说来可以使用PyObject_GetAttrString()获得,pargs是函数的参数列表,通常是使用Py_BuildValue()来构建。
由于注释很详细我就直接贴代码了
/* * 该函数传递参数都是字符串*parmcount:python函数参数个数,也就是最后多参个数* pythonPath:python 模块路径* modulName:模块名* functionName: python 函数名* ... : 多参数,python 函数参数*/int MainWindow::runPythonFunction(int parmsCount,const char *pythonPath,const char *modulName,const char *functionName,...){ //初始化,载入python的扩展模块 Py_Initialize(); //判断初始化是否成功 if(!Py_IsInitialized()) { cout<<("Python init failed!\n")<"< < "< <
转载地址:http://rhnvb.baihongyu.com/