2010-08-18 211 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。