用C模块扩展python
所以我有一个C程序来连接一个i2c设备。我需要从python接口到该设备。我只是想知道是否值得将程序移植到python模块中,或者如果涉及移植的工作量不会超过仅使用子进程执行程序。我知道我确定每个应用程序都有所不同,但我想知道是否值得我学习python C扩展并移植此程序。用C模块扩展python
更新:我可以完全访问C以及Python的源代码。但是在python方面已经做了大量的工作,并且我希望尽可能少的改变,如果这很重要的话。而且我也想尽量减少必须对C做出的改变。这是可行的,但我没有写出来,它涉及到很多,我不想重做。
不要使用Python C API,还有更简单的选择,最值得注意的是cython。
cython是一种类似Python的语言,它编译为Python C库的C代码。基本上它是Python的语法和特性(例如循环,异常等的好处)。 cython显然是编写Python扩展的最佳方式。
您可能还想看看ctypes,一个模块来动态加载C库并从它们调用函数。如果您的i2c代码可用作共享库,则您可以完全没有本地绑定,这可以简化开发和分发。
我已经使用ctypes祝你好运。不管你选择什么,虽然你可能不会获得任何时间这个时间,但下一次你的努力会比做整个事情要快得多。
我会推荐使用共享库的ctypes。不过,不要依赖C API中的结构等复杂类型。使用伪OOP方法是最简单的映射到Python。
E.g.
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(或类似的东西)。
我编写的第一个Python程序之一是一个脚本,它从C库中调用函数,这听起来接近你正在做的事情。我使用ctypes,我对它的容易程度印象深刻:我可以通过编写几行python(根本不需要C)来访问python中的每个库函数。我之前曾尝试过Python C API,并且需要更多的样板。我没有试过SWIG或Cython。
对于Cython的+1,但我会认为Cython是Python的超集。 – carl 2010-08-18 23:10:04
你有链接到一个使用预先存在的C代码来实现Cython的例子吗?我发现我似乎在编写C代码以适合python – Falmarri 2010-08-18 23:25:34
@carl,因为Cython没有Python的特性,它怎么可能是超集?“扩展子集”(实际上描述了两种语言之间的关系,如果从字面上理解;-)至少在数学上是正确的;-)。 – 2010-08-19 00:07:31