[英]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.