与C/C++库交互¶
C语言外部函数接口(CFFI)¶
CFFI 通过 CPython 和 PyPy 给出了和 C语言交互的简单使用机制。它支持两种模式:一种是内联的 ABI 兼容模式(示例如下),它允许您动态加载和运行可执行模块的函数(本质上与 LoadLibrary 或 dlopen 拥有相同的功能); 另一种为API模式,它允许您构建C语言扩展模块。
ABI 交互¶
1from cffi import FFI
2ffi = FFI()
3ffi.cdef("size_t strlen(const char*);")
4clib = ffi.dlopen(None)
5length = clib.strlen("String to be evaluated.")
6# prints: 23
7print("{}".format(length))
ctypes¶
ctypes 是CPython中与C/C++ 交互的事实上的标准库。它不仅能完全访问大多数主流操作系统(比如:Windows上的Kernel32, *nix上的libc)的纯C接口,并且支持对动态库的加载和交互,如DLL和运行时共享对象。 它同时涵盖许多可和系统API交互的类型,并允许您以相对简单的方式定义自己的复杂类型, 如struct和union,并在需要时允许您作出如填充、对齐这样的修改。对它的使用可能稍显复杂, 但与 struct 模块配合使用, 可通过纯C(++)方法让您从根本上控制您的数据类型转换成更有用的东西。
Struct Equivalents¶
MyStruct.h
1struct my_struct {
2 int a;
3 int b;
4};
MyStruct.py
1import ctypes
2class my_struct(ctypes.Structure):
3 _fields_ = [("a", c_int),
4 ("b", c_int)]
SWIG¶
SWIG 并不仅仅应用于Python(它支持多种脚本语言), 它是生成解释性语言和C/C++头文件绑定的工具。它极易使用:使用者只需简单的定义接口文件 (详见相关指南和文档),包含必要的C/C++头文件,并对它们运行生成工具。但它也有其局限性, 目前,它与C++部分新特性间仍存在问题,而模板重码的工作多少有些冗繁。只需少量的工作, 它便能提供诸多作用,并展现Python的许多特性。同时,您可以简单的扩展SWIG生成的绑定 (在接口文件中)来重载操作符和内建函数,也可以有效的重新转换C++异常, 使其可被Python所捕获。
例子: Overloading __repr__¶
MyClass.h
1#include <string>
2class MyClass {
3private:
4 std::string name;
5public:
6 std::string getName();
7};
myclass.i
1%include "string.i"
2
3%module myclass
4%{
5#include <string>
6#include "MyClass.h"
7%}
8
9%extend MyClass {
10 std::string __repr__()
11 {
12 return $self->getName();
13 }
14}
15
16%include "MyClass.h"
Boost.Python¶
Boost.Python 需要一些手动工作来展现C++对象的功能,但它可提供SWIG拥有的所有特性。同时, 它可提供在C++中访问Python对象的封装,也可提取SWIG封装的对象, 甚至可在C++代码中嵌入部分Python。
