用C/C++扩展Python
来源:互联网 发布:上海哪家seo公司好 编辑:程序博客网 时间:2024/06/05 10:51
这两天接到一个任务,要求将一个C库封装成python模块,供python使用。以前玩过一阵子python,也没太深入,满足需求就够了。也一直好奇想看看C/C++如何扩展python。
由C/C++写的python模块最终生成为一个.so(Linux平台)文件。在当前目录下就可以import进来了。那先写个简单的模块。
每个模块需要一个初始化函数,函数声明为:
void init模块名();
其中使用Py_InitModule来初始化模块。该函数的第二个参数传递了要导出的函数。定义在了exampleMethods当中。
在exampleMethods当中只导出了一个函数,就是wrap_test。参数类型为METH_VARARGS。意思是将函数参数作为Tuple传递过来。还有其他几种传递方式,可以查阅文档。
python提供了方便的函数用来解析参数PyArg_ParseTuple,使用了类似printf的可变参数。类似的函数还有Py_BuildValue是将c数据类型转换成Python对象。具体python数据类型有具体的函数可以进行转换,也不必要非用Py_BuildValue。
以上就是最简单的一个例子了。导出个简单的函数。
在做python扩展的时候,最值得注意的是对象引用计数。Python中的对象都是通过引用计数实现垃圾收集。在写python扩展要非常小心。否则会造成段错误之类的错误。
首先引用分为两种,一种是新引用(New reference),一种是借用引用(Borrowed reference),就是python当中的弱引用。
python api中的函数返回大多为新引用,部分(PyDict_GetItem)为借用引用。在编写扩展的时候要小心。函数的参数都为借用引用。
使用以下函数增减引用计数:
Py_INCREF
Py_XINCREF
Py_DECREF
Py_XDECREF
Py_CLEAR
就记录这么多了,知道大概这么些个规则,其实就可以开工了,剩下的边写边查文档就可以搞定了。当然用python不用面向对象多么没意思,回头再记录一下用C/C++扩展Python Object。
- 用c扩展python
- 用C/C++扩展Python
- 用C/C++扩展Python
- [原]用C扩展python
- C扩展python实例
- C语言扩展Python
- C语言扩展Python
- python c扩展
- Python的C扩展
- Python:C语言扩展
- Python 扩展C
- python之C扩展
- python C/C++ 扩展
- python扩展C
- 扩展python 用C语言编写python扩展代码
- 用C语言扩展Python的功能
- 用C语言扩展Python的功能
- 用C语言扩展Python的功能
- 前端开发优化
- GTK+3.0的发布公告
- LINUX设备驱动之tty及console驱动(二)
- Android中的常用布局
- 面向对象
- 用C/C++扩展Python
- 纵横三国外挂手记(2) 架构篇
- MySQL数据库之使用与开发(一)------mysql入门
- 编辑利器-----VIM
- 数据库 索引
- Android修改文件权限
- javascript跨域问题
- 线段树总结
- IsDebuggerPresent() 函数检测进程是否运行在调试器的控制下