簡體   English   中英

用C模塊擴展python

[英]Extending python with C module

因此,我有一個C程序可與i2c設備接口。 我需要從python連接到該設備。 我只是想知道是否值得將該程序移植到python模塊中,或者移植所涉及的工作量是否不超過僅使用子進程執行該程序的花費。 我知道我確定每個應用程序都不同,但是我想知道是否值得花時間學習python C擴展並移植該程序。

更新:我可以完全訪問C和python的源代碼。 但是在python方面已經進行了大量工作,我想盡可能減少更改,如果這很重要的話。 而且,我也想最小化對C語言所做的更改。它是可行的,但是我沒有編寫它,並且涉及到很多我不想重做的問題。

您可以采用多種方式進行操作-Python C API(您似乎正在考慮的一種),還有SWIGCythonctypes ...,只要可以將現有的C代碼制成 (函數“可從外部調用”),則您有很多選擇。 就個人而言,我建議使用Cython -它越來越多地作為Python的廣泛子集,並且擴展得足以允許有效地編譯為機器代碼並直接從C庫調用函數。

我編寫的第一個Python程序之一是一個腳本,該腳本從C庫調用函數,聽起來很像您在做的事情。 我使用了ctypes,它的簡單性給我留下了深刻的印象:我可以通過編寫幾行python(根本就沒有C!)來從python訪問每個庫函數。 我之前嘗試過Python C API,它需要更多樣板。 我還沒有嘗試過SWIG或Cython。

不要使用Python C API,有很多更容易的選擇,最著名的是cython。

cython是一種類似Python的語言,可以編譯為Python c庫的C代碼。 基本上,它是具有Python語法和功能的C(例如,適合循環,異常等)。 cython顯然是為python編寫C擴展的最可取的方法。

您可能還想看看ctypes,這是一個動態加載C庫並從中調用函數的模塊。 如果您的i2c代碼可作為共享庫使用,則完全不用本機綁定就可以擺脫,這簡化了開發和分發。

我已經使用ctypes了。 但是,無論您選擇什么, 這次都可能不會有任何收獲,但是下一次的努力比用C語言完成整個工作要快得多。

我建議使用共享庫的ctypes。 但是,最好不要依賴C API中的復雜類型(如struct)。 使用偽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。 create_string_buffer(或類似的東西)也支持c樣式字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM