C++调用Python(基础)
来源:互联网 发布:苹果mac怎么安装迅雷 编辑:程序博客网 时间:2024/05/22 20:58
转载:http://blog.csdn.net/magictong/article/details/8947892
前言
通过C++调用Python脚本主要要用到如下的一些Python提供的API,因为实际上C++要调用的是Python的解释器,而Python解释器本质就是实现在动态链接库里面的,因此在调用前和调用后要进行一些初始化和资源释放的工作,另外,要调用Python脚本里面的函数等等东西,需要Python提供的一些特殊API来包装C++调用。
主要函数
(1)void Py_Initialize(void)
初始化Python解释器,如果初始化失败,继续下面的调用会出现各种错误,可惜的是此函数没有返回值来判断是否初始化成功,如果失败会导致致命错误。
(2)int Py_IsInitialized(void)
检查是否已经进行了初始化,如果返回0,表示没有进行过初始化。
(3)void Py_Finalize()
反初始化Python解释器,包括子解释器,调用此函数同时会释放Python解释器所占用的资源。
(4)int PyRun_SimpleString(const char *command)
实际上是一个宏,执行一段Python代码。
(5)PyObject* PyImport_ImportModule(char *name)
导入一个Python模块,参数name可以是*.py文件的文件名。类似Python内建函数import。
(6)PyObject* PyModule_GetDict( PyObject *module)
相当于Python模块对象的dict属性,得到模块名称空间下的字典对象。
(7)PyObject* PyRun_String(const char* str, int start,PyObject* globals, PyObject* locals)
执行一段Python代码。
(8)int PyArg_Parse(PyObject* args, char* format, ...)
把Python数据类型解析为C的类型,这样C程序中才可以使用Python里面的数据。
(9)PyObject* PyObject_GetAttrString(PyObject *o, char*attr_name)
返回模块对象o中的attr_name 属性或函数,相当于Python中表达式语句,o.attr_name。
(10)PyObject* Py_BuildValue(char* format, ...)
和PyArg_Parse刚好相反,构建一个参数列表,把C类型转换为Python对象,使得Python里面可以使用C类型数据。
(11)PyObject* PyEval_CallObject(PyObject* pfunc, PyObject*pargs)
此函数有两个参数,而且都是Python对象指针,其中pfunc是要调用的Python 函数,一般说来可以使用PyObject_GetAttrString()获得,pargs是函数的参数列表,通常是使用Py_BuildValue()来构建。
C++怎么向Python传递参数
C++向Python传参数是以元组(tuple)的方式传过去的,因此我们实际上就是构造一个合适的Python元组就可以了,要用到PyTuple_New,Py_BuildValue,PyTuple_SetItem等几个函数,其中Py_BuildValue可以有其它一些的替换函数。
PyObject* pyParams = PyTuple_New(2); PyObject* pyParams1= Py_BuildValue("i",5); PyObject* pyParams2= Py_BuildValue("i",6); PyTuple_SetItem(pyParams,0, pyParams1); PyTuple_SetItem(pyParams,1, pyParams2); pRet = PyEval_CallObject(pFunc, pyParams);
C++怎么转换Python的返回值
Python传回给C++的都是PyObject对象,因此可以调用Python里面的一些类型转换API来把返回值转换成C++里面的类型。类似PyInt_AsLong,PyFloat_AsDouble这些系列的函数。Python比较喜欢传回一个元组,可以使用PyArg_ParseTuple这个函数来解析。这个函数也要用到上面的格式常量。还有一个比较通用的转换函数是PyArg_Parse,也需要用到格式常量。
- C++调用Python(基础)
- Python调用C/C++(使用SWIG)
- Python调用c/c++函数(1)
- Python调用c/c++函数(1)
- Python调用C可执行程序(subprocess)
- C/C++ 调用 Python(实例)
- c/c++调用python(2)
- BCB(C++)调用Python
- C中调用PYTHON
- C调用python
- C调用python
- Python 调用 C函数
- python调用c
- Python 调用C
- c中调用python
- Python调用c/c++
- c 调用python
- python 调用 c 函数
- leetcode Javascript HappyNumber
- C++实验2-3-两点距离
- CODEVS 1576 最长严格上升子序列
- [BZOJ2724][Violet 6]蒲公英(分块)
- SAE 使用GIT
- C++调用Python(基础)
- SHELL学习日记1
- C++实验2-4-模拟ATM
- Android界面开发问题总结
- linux网络发包性能优化
- shiro拦截器详细介绍
- mysql的C++ API之mysql_use_result()的用法实例
- 简单工厂模式——加减乘除
- Learning C++ 1.数据类型