python调用接口函数 python调用外部接口

我会Python,且第三方系统有接口,我应该如何通过Python去调用第三方系统的接口,进行对接?python因为良好python调用接口函数的编码性和扩展库正被大规模的使用,但python调用接口函数他有两个缺点:1、代码可见python调用接口函数;2、执行效率低,于是在实际应用中经常会把高效和核心代码用C/C++实现,业务部分用python实现 。这就需要进行混合编程,本文对python调用动态库的方法及注意事项进行记录
主题
python标准库函数中提供python调用接口函数了调用动态库的包————ctypes
加载动态库
查找动态库ctypes.util.find_library
根据动态库调用方式的不同,可以分为cdecl和stdcall两种 , 这两种方式的主要区别见下表 。后面的例子以cdecl调用方式为例,stdcall类同 。
调用标准 内存栈维护者 函数名
cdecl 调用者 前面加下划线,后面加“@”符号和参数的字节数
stdcall 被调用者 在输出函数名前面加下划线
* ctypes加载动态库有两种方式 。构造类对象libc = CDLL("libtestlib.dll")和实例化instancelibc = cdll.LoadLibrary("libtestlib.dll") 。这两种方式都会返回一个动态库操作的句柄,
在python中如何调用PCSC中的接口你找个工具将这个接口API,自动转换成python版本的就可以了 。好象是SWIG和Boost 。这两个以前看过,偶尔还试过几次 。之所以建议你用自动工具,就是因为python对于C++扩展麻烦些,对于C语言接口可以使用ctypes和cython简单解决 。不过C++如果用这些方法有时候被很麻烦 。
boost在linux里会经常用到,在windows下也可以使用 。SWIG在一般的教程里都会提及到 。SIP也是最近出名的 。
下面是一些参考资料 , 搜索来的 。
=== 使用工具进行扩展 ===
虽然扩展过程并不复杂,但也可以使用许多已知的工具简化扩展过程 。
(1) SWIG
由David Beazley创建,是一个自动的扩展构造工具 。它读入注释的C/C++头文件,为python、tcl、perl等多种脚本语言产生wrap代码 。SWIG可以包装大量C++特性到Python的扩展模块中 。
评价:swig简单,可以支持多种脚本文件,但支持的c++特性不完备 。
(2) SIP
由Phil Thompson创建,是一个C++模块构造器,专门为C++的类创造wrapper 。它曾经被用于创建PyQt和PyKDE扩展模块,因此比较出名 。
评价:支持C++特征很齐全,但比较复杂 。
(3) bgen
该工具被包含在标准Python发布包中的模块构建工具集里,由Jack Jansen维护 。它用于产生在Macintosh版本可用的Python扩展模块 。
(4) pyfort
由Paul dubois创建,用来产生Fortran语言生成的扩展模块 。
(5) cxx
也由Paul Dubois创建 , 是一个库,为Python的C++扩展提供了友好的API 。Cxx允许将许多python对象(如list和tuple)使用到STL的运算中 。库也提供了C++异常处理到python异常处理的转化 。
(6) WrapPy
由Greg Couch创建,通过读入C++头文件来产生扩展模块 。
(7) Boost Python Library
由David Abrahams创建 。该库提供了更多与众不同的C++ wrap到python扩展中 , 而只需要对要扩展的C++类写很少的附加信息 。
评价:Boost为C++提供了许多实用的库,如Regex(正则表达式库)、Graph(图组件和算法)、concept check(检查泛型编程中的concept)、Thread(可移植的C++多线程库)、Python(把C++类和函数映射到Python之中)、Pool(内存池管理)等等 。
Boost总体来说是实用价值很高,质量很高的库 。并且强调对跨平台的支持 。但是Boost中也有很多是实验性质的东西,在实际的开发中实用需要谨慎 。
boost.python支持的c++特性较多,但是比较复杂 。

推荐阅读