[英]Wrapping C for object oriented programming in Python
我編寫了一個C
代碼,用於與 Raspberry Pi 進行芯片通信,其中包括幾個公共功能。
為了包裝它以在Python
使用,我將代碼編譯到so
文件中並使用了ctypes
,因為這對我來說是最簡單的方法。
但是,這種方法有兩個缺陷:
MCP4728 = cdll.LoadLibrary("./MCP4728.so") multipleexternal = MCP4728.multipleexternal multipleexternal.restype = c_int multipleexternal.argtypes = [POINTER(c_float), c_bool] voltages=[0.5,1.5,2.5,2.5] floats = (c_float*4)(*voltages) multipleinternal(floats,False)
我不知道如何將其轉換為面向對象編程,因此可以同時連接兩個不同的芯片。
最后,我想將我的軟件公開並發布到github
。 在這種情況下,也許首選其他包裝方法。
我知道有包裹的許多其他方法C
代碼Python
,如所描述這里。 您能給我建議使用哪種方法,甚至是最合適的面向對象編程示例嗎?
感謝幫助!
編輯:
這不僅是句法問題,也是概念問題。 C
庫中的函數可用於所有芯片,但每個芯片都需要在庫中保存一組不同的變量。
所以我該怎么做? 在 Python 中定義類,其中創建新對象意味着在連接到該對象的庫中創建新struct
? 或者也許為每個對象使用C
庫的新實例? 或者在C
庫中創建類/對象? 我完全一竅不通。
大概您在談論 Microchip MCP4728。 這是一個 I2C 連接設備,因此它在 I2C 總線上有一個地址。 如果您在默認出廠條件下使用它,請訪問地址 0b1100000。 因此,要擁有“兩個不同的芯片”,您需要 2 個獨立的 I2C 總線,或者利用 MCP4728 上的可重新編程尋址並將其中一個設置為 0b1100001(為此您需要控制 /LDAC 引腳在設備上),以便 2 個可以存在於一個 I2C 總線上。
無論哪種方式,您都需要某種可以傳遞給 C 函數的設備的“上下文”。 這可能只是總線編號或設備地址。
或者您可以發揮創意,並且(如評論中所暗示的)具有某種結構,其中包含設備地址或總線編號。 為此,您需要一個初始化程序,一個與構造函數等效的函數。 您可以將此結構傳遞到每個 C 函數中,就像 OI Sen 所描述的那樣。 MCP4728 上有各種可用設置(如 VRef 選擇、增益和電源狀態),因此將這些設置的當前值存儲在結構中也是個好主意。
==編輯==
Pygmalion (OP) 找到了一個有用答案的鏈接,這里Python ctypes pointer to struct as identifier without member access 。
此外,將整個內容包裝在一個 python 類中可能會很方便,因此您可以使用__del__
析構函數來確保自動進行清理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.