1. 苏葳的备忘录首页
  2. 开发工具

Python的SWIG,ctypes等与C的互操作性

python swig ctypes在许多情况下,Python能够调用C模块或者C里面调用Python解释器是非常有用的,语言之间取长补短有助于更好的解决问题。这里需要明白一个概念,我们平时所说的Python标准实现,其实应该称为CPython,相应的,还有IronPython(C#实现)和Jython(java)实现,另两种实现可以无缝调用.net库和Java类库。而对于CPython,经过多年的积累和演化,调用C库有许多可选择的工具,下面是这些工具的简要介绍:

SWIG:

SWIG是个帮助使用C或者C++编写的软件能与其它各种高级编程语言进行嵌入联接的开发工具。SWIG能应用于各种不同类型的语言包括常用脚本编译语言例如Perl, PHP, Python, Tcl, Ruby and PHP。支持语言列表中也包括非脚本编译语言,例如C#, Common Lisp (CLISP, Allegro CL, CFFI, UFFI), Java, Modula-3, OCAML以及R,甚至是编译器或者汇编的计划应用(Guile, MzScheme, Chicken)。SWIG普遍应用于创建高级语言解析或汇编程序环境,用户接口,作为一种用来测试C/C++或进行原型设计的工具。SWIG还能够导出XML或Lisp s-expressions格式的解析树。SWIG可以被自由使用,发布,修改用于商业或非商业中。

SWIG是一种C/C++和脚本语言之间的接口编译器,其工作原理大概是使用C库的头文件生成一个包装器,脚本语言得以通过这些包装定义访问C库。包装器一次定义,可使用于所有支持的脚本语言(大约19种左右)。

1 用脚本语言而非C中的main()函数来控制程序流程,这样在做出调整时不需修改C代码和重新编译。事实上,多数大项目都会提供一种脚本语言,宏语言或配置语言为开发者提供灵活性。

2 SWIG使C代码可被快速部署在脚本环境,用于测试或调试,甚至用于最终产品。

3 SWIG使得不同的C模块可被组合进同一个脚本语言环境,并协同工作。

4 SWIG使标准C/C++库可被转换成某种流行脚本语言的组件,当然,是在别人没做过的前提下。

SWIG有时被与接口定义语言(IDL)相比交,比如COM和CORBA,但并不如这些语言一样繁琐。

SWIG出现于1996年2月。 主要用途是为c/c++程序员提供一种增加脚本语言到自己程序中的手段。

CTypes:

ctypes已经成为python标准的一部份。ctypes是一个python的外部函数库,它提供C兼容的数据类型,允许调用C的dll和动态库,可用于将这些库在纯python中打包。

Pyrex:

python已经有非常容易扩展出C和C++模块的工具,为何还要设计Pyrex?

已有工具需遵循模板代码,还要处理C和python间的数据类型转换。基本类型转换还好,但是涉及python对象时,在C库中需要处理引用计数,逐步查错和出错时清理属性,并且难于调试。

比如广为人知的SWIG,它使用定义文件来生成C扩展模块,一般而言你不需了解Python的C API,但是在你在Python和C之间重组数据时需使用API调用。另外SWIG无助于你想创建自己的Python内建类型的时候。

另一种工具是Pyinline,它允许你将C代码写在python文件中,并自动生成C扩展,但它同样只能处理基本数据类型的转换。

而Pyrex可以象SWIG同样好的处理基本类型转换,并且它可以让你以简单自然的方式写代码完成C数据类型和Python类型的转换,而不需了解任何Python/C API。你即不需要提心引用计数和错误检 它由Pyrex在后台自动处理,并且Pyrex可以让你自定义新的内建Python类型,就象在Python中定义新类一样简单。

然而目前 Pyrex仍不支持一些Python或C的语言特性。

原创文章,作者:苏葳,如需转载,请注明出处:https://www.swmemo.com/414.html

发表评论

邮箱地址不会被公开。 必填项已用*标注