与C/C++库交互¶
C语言外部函数接口(CFFI)¶
CFFI 通过CPython和PyPy给出了和 C语言交互的简单使用机制。它支持两种模式:一种是内联的ABI兼容模式(示例如下), 它允许您动态加载和运行可执行模块的函数(本质上与LoadLibrary和dlopen拥有相同的功能); 另一种为API模式,它允许您构建C语言扩展模块。
ABI 交互¶
1 2 3 4 5 6 7 | from cffi import FFI
ffi = FFI()
ffi.cdef("size_t strlen(const char*);")
clib = ffi.dlopen(None)
length = clib.strlen("String to be evaluated.")
# prints: 23
print("{}".format(length))
|
Struct Equivalents¶
MyStruct.h
1 2 3 4 | struct my_struct {
int a;
int b;
};
|
MyStruct.py
1 2 3 4 | import ctypes
class my_struct(ctypes.Structure):
_fields_ = [("a", c_int),
("b", c_int)]
|
例子: Overloading __repr__¶
MyClass.h
1 2 3 4 5 6 7 | #include <string>
class MyClass {
private:
std::string name;
public:
std::string getName();
};
|
myclass.i
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | %include "string.i"
%module myclass
%{
#include <string>
#include "MyClass.h"
%}
%extend MyClass {
std::string __repr__()
{
return $self->getName();
}
}
%include "MyClass.h"
|
Boost.Python¶
Boost.Python 需要一些手动工作来展现C++对象的功能,但它可提供SWIG拥有的所有特性。同时, 它可提供在C++中访问Python对象的封装,也可提取SWIG封装的对象, 甚至可在C++代码中嵌入部分Python。