1

所以我有一个 C 程序来连接 i2c 设备。我需要从 python 连接到该设备。我只是想知道是否值得将程序移植到 python 模块中,或者移植所涉及的工作量是否不会超过仅使用子进程执行程序。我知道我确信每个应用程序都不同,但我想知道是否值得我花时间学习 python C 扩展和移植这个程序。

更新:我可以完全访问 C 和 python 的源代码。但是在 python 方面已经完成了大量的工作,如果这很重要,我想尽可能减少对它的更改。而且我还想尽量减少必须对 C 进行的更改。这是可行的,但我没有编写它,它涉及到很多我不想重做的地址。

4

5 回答 5

3

有很多方法可以继续——Python C API,这似乎是你正在考虑的,还有SWIGCythonctypes ......只要你现有的 C 代码可以被制作成一个(使用函数可“从外部”调用),您有很多选择。就个人而言,我建议Cython——它越来越像 Python 的一个广泛子集,扩展得刚好足以允许有效地编译成机器代码并直接调用 C 库中的函数。

于 2010-08-18T21:56:00.923 回答
2

我编写的第一个 Python 程序之一是一个从 C 库中调用函数的脚本,这听起来与您正在做的很接近。我使用了 ctypes,它的简单程度给我留下了深刻的印象:我只需编写几行 python 就可以从 python 访问每个库函数(根本没有 C!)。我之前尝试过 Python C API,它需要更多样板。我没有尝试过 SWIG 或 Cython。

于 2010-08-18T22:18:23.120 回答
1

不要使用 Python C API,还有更简单的替代方案,最著名的是 cython。

cython 是一种类似 Python 的语言,它编译成 Python c 库的 C 代码。基本上它是具有 Python 语法和特性的 C 语言(例如,循环、异常等很好)。cython 显然是为 python 编写 C 扩展的最值得推荐的方式。

您可能还想看看 ctypes,这是一个动态加载 C 库并从中调用函数的模块。如果您的 i2c 代码可用作共享库,则您可以完全摆脱本机绑定,从而简化开发和分发。

于 2010-08-18T22:10:58.623 回答
0

我在使用 ctypes 时很幸运。但是,无论您选择什么,一次您可能不会获得任何时间,但下一次您的努力将比在 C 中完成整个事情要快得多。

于 2010-08-18T22:12:58.043 回答
0

我会推荐使用共享库的 ctypes。但是,不要依赖 C API 中的结构等复杂类型,这将是一个好主意。使用伪 OOP 方法是映射到 Python 的最简单方法。

例如

foo_t* foo_new(void);
int foo_bar(foo_t*, int);
int foo_baz(foo_t*, int);
void foo_free(foo_t*);

在这里,您可以使用 ctypes 原生的东西。例如 c_void_p 用于您的对象句柄和 c_int。c 风格的字符串也支持 create_string_buffer (或类似的东西)。

于 2010-08-18T22:17:43.087 回答