快速简便地将C代码封装成Python
项目描述
∘ 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 类型,如 list 或 dict。使用这些类型通常会将性能降低到接近纯 Python 的水平,因此这在实践中是一个小的损失。
您不能使用 C++。
支持的编译器
以下操作系统/编译器组合得到全面支持并定期测试。
编译器 |
Linux |
Windows |
macOS |
FreeBSD |
OpenBSD |
NetBSD |
Cygwin/msys2 |
Android* |
---|---|---|---|---|---|---|---|---|
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✓ |
✗ |
|
✓ |
✓ |
✓ |
✓ |
✓ |
✗ |
✓ |
✓ |
|
MSVC |
✗ |
✗ |
✗ |
✗ |
✗ |
✗ |
✗ |
✗ |
✓ |
✓ |
✗ |
✗ |
✗ |
✗ |
✗ |
✗ |
|
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 贡献者的荣誉榜.
向 JetBrains 致以崇高的敬意,因为他们提供了 PyCharm 以及向开源开发者免费提供其全部产品 (能够从 docker 容器内部运行 Python,并具有自动完成、调试和其他所有功能,这对本项目的帮助很大。)
通过 Cookiecutter 和 audreyr/cookiecutter-pypackage 项目模板的分支,大大加快了这个包的初始创建过程。
项目详情
下载文件
下载您平台的文件。如果您不确定要选择哪一个,请了解有关 安装包 的更多信息。
源分发
构建分发
cslug-0.7.0-py3-none-any.whl 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 8c3733405e8b14ac1495ef33e75be004b7d85138ed5b24c60f4b6b6ce5915c1b |
|
MD5 | 6bf36a77d559e5505405e8dd0176b609 |
|
BLAKE2b-256 | 35e3551f1daeb591717a6b217ace7f4236e6164b6691af28e36d72562850691b |