2010-08-18 142 views
1

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

更新:我可以完全访问C以及Python的源代码。但是在python方面已经做了大量的工作,并且我希望尽可能少的改变,如果这很重要的话。而且我也想尽量减少必须对C做出的改变。这是可行的,但我没有写出来,它涉及到很多,我不想重做。

回答

3

有很多方法可以继续 - Python C API,这似乎是你正在考虑的,但也可以是SWIG,Cython,ctypes ......只要你现有的C代码可以被制作成一个图书馆(功能可从外部调用),你有很多选择。就个人而言,我建议使用Cython--它越来越多地被看作是Python的一个广泛的子集,只是扩展到足以允许有效编译成机器代码并直接调用C库中的函数。

+0

对于Cython的+1,但我会认为Cython是Python的超集。 – carl 2010-08-18 23:10:04

+0

你有链接到一个使用预先存在的C代码来实现Cython的例子吗?我发现我似乎在编写C代码以适合python – Falmarri 2010-08-18 23:25:34

+0

@carl,因为Cython没有Python的特性,它怎么可能是超集?“扩展子集”(实际上描述了两种语言之间的关系,如果从字面上理解;-)至少在数学上是正确的;-)。 – 2010-08-19 00:07:31

1

不要使用Python C API,还有更简单的选择,最值得注意的是cython。

cython是一种类似Python的语言,它编译为Python C库的C代码。基本上它是Python的语法和特性(例如循环,异常等的好处)。 cython显然是编写Python扩展的最佳方式。

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

0

我已经使用ctypes祝你好运。不管你选择什么,虽然你可能不会获得任何时间这个时间,但下一次你的努力会比做整个事情要快得多。

0

我会推荐使用共享库的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(或类似的东西)。

2

我编写的第一个Python程序之一是一个脚本,它从C库中调用函数,这听起来接近你正在做的事情。我使用ctypes,我对它的容易程度印象深刻:我可以通过编写几行python(根本不需要C)来访问python中的每个库函数。我之前曾尝试过Python C API,并且需要更多的样板。我没有试过SWIG或Cython。