• 与C/C++库交互
    • C语言外部函数接口(CFFI)
      • ABI 交互
    • ctypes
      • Struct Equivalents
    • SWIG
      • 例子: Overloading repr
    • Boost.Python

    与C/C++库交互

    https://farm5.staticflickr.com/4173/34725951345_c8f5959a2e_k_d.jpg

    C语言外部函数接口(CFFI)

    CFFI 通过CPython和PyPy给出了和C语言交互的简单使用机制。它支持两种模式:一种是内联的ABI兼容模式(示例如下),它允许您动态加载和运行可执行模块的函数(本质上与LoadLibrary和dlopen拥有相同的功能);另一种为API模式,它允许您构建C语言扩展模块。

    ABI 交互

    1. from cffi import FFI
    2. ffi = FFI()
    3. ffi.cdef("size_t strlen(const char*);")
    4. clib = ffi.dlopen(None)
    5. length = clib.strlen("String to be evaluated.")
    6. # prints: 23
    7. print("{}".format(length))

    ctypes

    ctypes 是CPython中与C/C++交互的事实上的库。它不仅能完全访问大多数主流操作系统(比如:Windows上的Kernel32,*nix上的libc)的纯C接口,并且支持对动态库的加载和交互,如DLL和运行时共享对象。它同时涵盖许多可和系统API交互的类型,并允许您以相对简单的方式定义自己的复杂类型,如struct和union,并在需要时允许您作出如填充、对齐这样的修改。对它的使用可能稍显复杂,但与 struct 模块配合使用,可通过纯C(++)方法让您从根本上控制您的数据类型转换成更有用的东西。

    Struct Equivalents

    MyStruct.h

    1. struct my_struct {
    2. int a;
    3. int b;
    4. };

    MyStruct.py

    1. import ctypes
    2. class 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>
    2. class MyClass {
    3. private:
    4. std::string name;
    5. public:
    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。

    原文: http://pythonguidecn.readthedocs.io/zh/latest/scenarios/clibs.html