我正在尝试使用ctypes模块使用Python单元测试框架对C代码进行单元测试。我使用GCC和Linux。被测试的C文件(packet.c)有一个头文件(packet.h),如下所示:
#ifndef PACKET_H
#define PACKET_H
void byte_received(char b);
void packet_received_callback(int length, char *packet);
#endif
这个想法是一个main函数用一些字节多次调用byte_received
,当找到一个有效校验和的有效数据包时,会调用packet_received_callback
。 packet_received_callback
函数未在packet.c中定义,但应由调用者代码(例如main.c或Python模块)提供。
如果我编译packet.c,从中创建一个共享对象,并使用ctypes.cdll.LoadLibrary("./packet.so")
从python加载它,然后我得到一个带有“未定义符号”消息的OSError。这当然是预期的,因为我没有在任何地方提供packet_received_callback
。这就是我不知道该怎么做。
我的问题是:在加载共享对象时,我能以某种方式获取ctypes以通过该名称导出全局函数吗?我知道如何在C可执行文件中执行此操作,但不知道如何在Python和ctypes中执行此操作。 ctypes模块支持C调用Python(通过将函数指针作为参数传递给C函数),这表明我想要的至少在理论上是可能的。
我已经知道我可以通过更改C代码解决这个问题,以便byte_received
调用存储在全局变量而不是全局函数中的函数指针(这是我的备份计划)。我问这个问题是因为我想避免这个问题。
答案 0 :(得分:0)
虽然 ctypes
不支持此用例,但事实证明较新的 cffi
库支持:https://cffi.readthedocs.io/en/latest/using.html#extern-python-new-style-callbacks