如何在Python中使用ctypes.byref作为参数之一来模拟ctypes函数
问题描述:
我正在对DLL/SO进行Python包装。我已经验证了调用实际DLL和SO的代码。我想单元测试我的包装,而不需要底层DLL/SO被安装。我正在寻找使用mock。如何在Python中使用ctypes.byref作为参数之一来模拟ctypes函数
我遇到的问题是采用byref参数和返回值的函数。例如,如果C fundtion看起来是这样的:
int initialize(char *resource, ulong *new_handle)
{
// Some code here
*new_handle = temp_handle;
return error;
}
和Python代码看起来像:
error_code = library.initialize(resource.encode('ascii'), ctypes.byref(session_handle))
我能嘲笑的功能和设置的返回值(错误代码)但我一直无法弄清楚如何设置session_handle中返回的值。
这是可能的,如果是这样,如何?
答
您可以通过返回值的_obj
属性访问传递给byref
对象:
x is ctypes.byref(x)._obj
或者至少,你可以为现在。这是一个无证API,可能会有变化。
一旦有了对象,你可以通过它value
属性设置它的值通常ctypes的方式:
byref_session_handle._obj.value = whatever