6.18. 与 c/c 库交互 | python 应用场景 |《python 最佳实践指南 2018 2018》| python 技术论坛-大发黄金版app下载

未匹配的标注

c语言外部函数接口

提供了一套简单易用的机制来帮助 cpython 和 pypy 与 c 语言进行交互。它支持两种模式:一种是内联的 abi 兼容模式(下面举例说明),这一模式允许您从可执行模块中动态加载和运行函数(本质上与 loadlibrary 和 dlopen 的功能相同);另一种是 api 模式,这一模式允许您构建 c 语言扩展模块。

from cffi import ffi
ffi = ffi()
ffi.cdef("size_t strlen(const char*);")
clib = ffi.dlopen(none)
length = clib.strlen("string to be evaluated.")
# 输出:23
print("{}".format(length))

ctypes

 是真正意义上让 cpython 与 c/c 进行交互的库,它不但提供了对大多数主流操作系统中原生 c 接口(例如 windows 系统下的 kernel32,类 unix 系统下的 libc)的完全访问能力,而且还提供了对动态库进行加载和交互的支持,例如对 dll 文件和运行时共享对象。ctypes 囊括了大量可用于与系统 api 交互的类型,并使您能够相当轻松地定义您自己的复杂类型,如结构体和联合体。如果需要的话,ctypes 还允许您修改诸如内边距、对齐方式等属性。ctypes 用起来可能略显繁琐,但与  模块结合起来,您基本上就可以随心所欲地控制您的数据类型,把它们转换为可由纯 c/c 方法使用的内容了。

等价的结构体

mystruct.h

struct my_struct {
    int a;
    int b;
};

mystruct.py

import ctypes
class my_struct(ctypes.structure):
    _fields_ = [("a", c_int),
                ("b", c_int)]

swig

是一个用来为 c/c 头文件和解释型语言生成绑定的工具,不过它并不局限于python(实际上它支持大量脚本语言)。这一工具极其简单易用:用户只需要定义一个接口文件(详见 swig 教程与文档),将必要的 c/c 头文件包含进来,再运行构建工具就可以了。虽然这一工具也有一些局限(例如,当前它似乎对一些较新的 c 特性不太支持,并且那些严重模板化的代码运行起来显得有点冗杂),但是它仅付出了很小的代价就提供了强大的功能并带给 python 大量的特性。此外,您可以轻易地对 swig 创建的绑定进行扩展来重载 python 的操作符与内置函数,以及高效地将 c 中的异常重新抛出并交由 python 进行捕获等等。

示例:重载 repr

myclass.h

#include 
class myclass {
private:
    std::string name;
public:
    std::string getname();
};

myclass.i

%include "string.i"
%module myclass
%{
#include 
#include "myclass.h"
%}
%extend myclass {
    std::string __repr__()
    {
        return $self->getname();
    }
}

boost.python

 需要一点人工操作来引入 c 对象的功能,但它能够提供 swig 所有的相同特性,并且还包括了提供了封装函数,可用于在 c 中访问 python 的 pyobjects 类型对象,提取 swig 封装的对象,甚至将 python 的一些代码嵌入到您的 c 代码中。

本文章首发在 大发黄金版app下载 网站上。

本译文仅用于学习和交流目的,转载请务必注明文章译者、出处、和本文链接
我们的翻译工作遵照 cc 协议,如果我们的工作有侵犯到您的权益,请及时联系大发黄金版app下载。

原文地址:https://learnku.com/docs/python-guide/20...

译文地址:https://learnku.com/docs/python-guide/20...

上一篇 下一篇
讨论数量: 0



暂无话题~
网站地图