Embedded Python应用小结
转载请注明来源:https://www.cnblogs.com/hookjc/
(1)初始化Python脚本运行环境
Py_Initialize();
(2) 脚本的编译
bytecode = Py_CompileString(script.c_str() , "active" , Py_file_input)
python有多种embeded的形式,我最喜欢的是用Py_CompileString来编译一个.py的脚本文件,这样有下面几个好处,引用方便,调试方便,灵活。
编译好后会返回一个PyObject* 的bytecode对象
要注意的是.py脚本的格式很重要,一定记得换行用Unix方式的,否则是不会编译通过的,我第一次时就找了很久才发现这个问题,还有一个要注意的问题是最好编一个调试版本的python的dll和库,这样便于发现问题。
(3)导入编译好的脚本
module=PyImport_ExecCodeModule("active",bytecode),这个过程是构造库的过程,运行完成之后就会把你要应用的Python库装入内存当中。
(4)从module中导出对象
dict = PyModule_GetDict( module )
导出对象表后你就可以按照你的需要使用你想用的python对象,这里常用的是类,方法,函数,我这里只用了最简单全局函数,用fun = PyDict_GetItemString( dict , "active" );得到想要使用的函数对象。
(5)调用Python函数
还剩下一个问题了,如何给调用的Python函数传递参数
python函数的参数是一个Tuple类型的值,通俗的理解就是名字和对象的列表,这样不管你传递多少参数,只要用一个Tuple类型就都解决了,代码如下
args = PyTuple_New( argsnum );
if( !args )
{
PyErr_Print();
assert(false);
}
for( i = 0 ; i < argsnum ; i++ )
{
value = PyString_FromString( strings[i] );
PyTuple_SetItem( args , i , value );
}
用PyString_FromString等类型转换函数就可以实现参数生成的过程了。
(6)调用函数,得到返回值
value = PyObject_CallObject( fun , args );
if(!value)
{
PyErr_Print();
assert(false);
}
value是PyObject用转换函数就可以得到C++类型的返回值了,到这儿一个完整的调用过程就结束了
(7)其它
调用结束后释放脚本运行环境Py_Finalize();
注意下面几个问题,PyObject*都是有引用计数的,看文档说明有些对象是要自己处理引用计数的用Py_DECREF来释放对象,一般说如是类new操作的对象都要释放对象,如果是通过query出来的对象一般不用释放。
来源:python脚本自动迁移
最新文章
- 《你不知道的JavaScript》读书笔记(二)词法作用域
- satis 搭建 Composer 私有库的方法
- php文件hash算法,秒传原理
- Filter设计实现IP地址限制
- WPF之小动画一
- WPF小程序:贪吃蛇
- 并行Linq(一)
- 解析 .Net Core 注入 (2) 创建容器
- ThinkPHP中处理Layout模板的问题
- C++课程设计类作业4
- [TCP] 网络协议流程图
- golang使用chrome headless获取网页内容
- android开发——Android开发中的47个小知识
- PON
- 小程序组件 scroll-view 滑动
- python 使用 sorted 对 列表嵌套元组的数据进行排序
- element的form表单中如何一行显示多el-form-item标签
- canal 配置
- ubuntu 下通过ftp命令下载文件
- composer 更新指定包