转载请注明来源: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脚本自动迁移

最新文章

  1. 《你不知道的JavaScript》读书笔记(二)词法作用域
  2. satis 搭建 Composer 私有库的方法
  3. php文件hash算法,秒传原理
  4. Filter设计实现IP地址限制
  5. WPF之小动画一
  6. WPF小程序:贪吃蛇
  7. 并行Linq(一)
  8. 解析 .Net Core 注入 (2) 创建容器
  9. ThinkPHP中处理Layout模板的问题
  10. C++课程设计类作业4
  11. [TCP] 网络协议流程图
  12. golang使用chrome headless获取网页内容
  13. android开发——Android开发中的47个小知识
  14. PON
  15. 小程序组件 scroll-view 滑动
  16. python 使用 sorted 对 列表嵌套元组的数据进行排序
  17. element的form表单中如何一行显示多el-form-item标签
  18. canal 配置
  19. ubuntu 下通过ftp命令下载文件
  20. composer 更新指定包

热门文章

  1. CS5218|DP转HDMI4K30HZ方案|CS5218应用方案
  2. Android开发案例 设置背景图片轮播
  3. ActiveMQ基础教程(一):认识ActiveMQ
  4. CGO封装C语言qsort函数
  5. JMeter_调试取样器(Debug Sampler)
  6. BIO、NIO、AIO --- 个人理解
  7. Linux上天之路(十三)之系统进程管理
  8. 主流浏览器内核、css权重
  9. elasticsearch拼写纠错之Term Suggester
  10. 在KALI以外的Linux上安装KALI上的工具(ubuntu,debian)