博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于 C++ 调用 python 详情
阅读量:2345 次
发布时间:2019-05-10

本文共 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/

你可能感兴趣的文章
将代码托管到GitHub
查看>>
Java实现PDF的生成(使用IText)
查看>>
MySQL学习笔记
查看>>
数据库连接池
查看>>
MySQL性能优化经验
查看>>
MySQL学习参考
查看>>
Java工程结构管理(BuildPath/系统库/外部库)
查看>>
将代码托管到Coding
查看>>
Myeclipse/Eclipse在pull时发生冲突报错Checkout conflict with files
查看>>
JS-异步提交表单的几种方式
查看>>
Http请求中的Context-Type及其SpringMVC中的使用
查看>>
SpringMVC实现上传下载文件
查看>>
AJAX异步提交表单(表单数据有文件流、字符串)
查看>>
MyBatis中遇到的一些问题
查看>>
在JSP使用EL和JSTL判断指定元素是否存在于指定集合中
查看>>
JDBC学习笔记
查看>>
Activiti配置Oracle不能自动创建表/流程启动是表或试图不存在的问题
查看>>
Oracle学习笔记
查看>>
JQuery EasyUI学习总结
查看>>
AJAX学习笔记
查看>>