簡體   English   中英

在 Python 中為面向對象編程包裝 C

[英]Wrapping C for object oriented programming in Python

我編寫了一個C代碼,用於與 Raspberry Pi 進行芯片通信,其中包括幾個公共功能。

為了包裝它以在Python使用,我將代碼編譯到so文件中並使用了ctypes ,因為這對我來說是最簡單的方法。

但是,這種方法有兩個缺陷:

  1. Python 代碼有時相當古怪 例如,如果函數采用一個數組作為參數,Python 中的編碼如下所示:
 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)
  1. 我不知道如何將其轉換為面向對象編程,因此可以同時連接兩個不同的芯片

  2. 最后,我想將我的軟件公開並發布到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.

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