跳转到主要内容

快速简便地将C代码封装成Python

项目描述

PyPI version https://img.shields.io/badge/coverage-100%25-%2326543A

MIT许可PyPI文档源代码报告错误获取支持

快速简便地将C代码封装成Python。cslug包在内置的ctypes库之上提供了一个薄层,使将函数和结构从C加载到Python变得更加容易。

// hello-cslug.c

int add_1(int x) {
  return x + 1;
}

double times_2(double x) {
  return x * 2.0;
}
>>> from cslug import CSlug
>>> slug = CSlug("hello-cslug.c")
>>> slug.dll.add_1(12)
13
>>> slug.dll.times_2(-5)
-10.0

替代方案

将C与Python结合并不是什么新鲜事 - 有很多其他方法。最常见的方法是编写Python扩展模块。可以在这里找到各种方法的精彩比较。cslug旨在成为最简单的方法,尽管它当然不是最灵活的。

使用由ctypes驱动的封装与Python扩展模块及其编写工具(如Cython)相比,既有优点也有缺点。

优点

  • C代码可以是简单的中学水平C。即使是Python扩展模块的“hello world”也有大约40行看起来很糟糕的宏。

  • 二进制文件未与 Python 链接,因此不依赖于特定版本的 Python。Python 扩展模块需要为每个 Python 小版本(3.6、3.7、3.8、3.9)和每个平台(Windows、macOS、Linux)重新编译,而 cslug 二进制文件只需为每个平台编译一次。

  • 您几乎可以使用任何 C 编译器。Python 扩展模块必须在 macOS 上使用 clang 和 Windows 上的 MSVC 构建。这种方法的真正优势在于您可以在所有平台上使用相同的编译器,从而使它们更加统一,从而大大降低您需要在最不喜欢的平台上调试问题的可能性。

  • 二进制文件的文件大小非常小。1000 行 C 代码在 Linux 上的二进制大小约为 20KB。Python 扩展模块通常要大几倍,一个简单的 Cython 化 import numpy 扩展要大几 MB。

缺点

  • 周围的 Python 代码自动化程度较低。Python 扩展模块看起来和感觉就像一个原生的 Python 模块,包括函数元数据和文档字符串,而 ctypes 通常需要一个小的包装函数。

  • 您不能在 C 代码中使用原生 Python 类型,如 listdict。使用这些类型通常会将性能降低到接近纯 Python 的水平,因此这在实践中是一个小的损失。

  • 您不能使用 C++。

共享注意事项

在您决定使用任何非纯 Python 之前,您应该记住:

  • 您需要为每个您希望支持的平台提供 wheels,否则您的代码的用户将不得不安装一个 C 编译器才能运行它。这意味着您要么需要访问所有平台,要么您将不得不设置持续集成以在云中构建您的软件包。Linux 用户可以通过使用 Vagrant 来解决这个问题。

  • Linux 轮子必须在 manylinux Docker 映像上构建,才能与大多数 Linux 发行版广泛兼容。

  • 最近的 macOS 版本通常会阻止或删除您产生的任何二进制文件,除非您购买代码签名许可证或您的软件足够著名,以至于 Apple 为您将其列入白名单(上传到 PyPI 的二进制文件似乎自动豁免)。

支持的编译器

以下操作系统/编译器组合得到全面支持并定期测试。

编译器

Linux

Windows

macOS

FreeBSD

OpenBSD

NetBSD

Cygwin/msys2

Android*

gcc

clang

MSVC

TinyCC

PGCC **

* 使用 Termux。** 作为 NVIDIA HPC SDK 的一部分可安装。

安装

cslug 需要 C 编译器来编译 C 代码。它最喜欢的编译器是 gcc。Linux 发行版通常预装了它。如果您使用的是其他操作系统或根本就没有它,那么您应该通过 mingw-w64 获取它。建议 Windows 用户下载 WinLibs 而不带 LLVM/Clang/LLD/LLDB(尽管 cslug 也可以使用 clang),并将它的 mingw64/bin 目录添加到 PATH 中。

通过在终端中运行以下命令来检查您是否已设置好:

gcc -v

默认情况下,如果找到,cslug 将使用 gcc。在 macOS 或 FreeBSD 上,如果 gcc 不可用,将切换到 clang。要使用任何其他支持的编译器,cslug 会尊重 CC 环境变量。将其设置为您的替代编译器的名称或完整路径。

使用常规方式安装 cslug 本身。

pip install cslug

由于 cslug 目前处于 0.x 版本,在次要版本增量时可能会发生破坏性更改。请勿假设向前兼容性 - 选择您喜欢的版本,并在 requirements.txt 中将其固定。请检查 变更日志,以确定可能会破坏您代码的内容。

快速入门

查看我们的 readthedocs 快速入门页面 以开始使用。

鸣谢

cslug 贡献者的荣誉榜.

项目详情


下载文件

下载您平台的文件。如果您不确定要选择哪一个,请了解有关 安装包 的更多信息。

源分发

此发布中没有可用的源分发文件。请参阅 生成分发存档 的教程。

构建分发

cslug-0.7.0-py3-none-any.whl (38.7 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页