我正在为DLL / SO开发Python包装器。我已经验证了代码可以调用实际的DLL和SO。我想对包装器进行单元测试,而无需安装基础的DLL / SO。我正在使用mock

我遇到的问题是使用byref参数并以这种方式返回值的函数。例如,如果C基金会看起来像这样:

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))


我可以模拟该函数并设置返回值(error_code),但是我无法弄清楚如何设置session_handle中返回的值。

这可能吗?如果可以,怎么办?

最佳答案

您可以通过返回值的byref属性访问传递给_obj的对象:

x is ctypes.byref(x)._obj


或者至少现在可以。这是一个未记录的API,可能会更改。

一旦有了对象,就可以通过其value属性以通常的ctypes方式设置其值:

byref_session_handle._obj.value = whatever

10-05 21:37