我需要使用DLL(我没有源代码)与其他进程通信。我使用ctypes,就像这样:
gcs = CDLL('some_dll.dll')
gcs.comm_init(byref(socket_id), 0, 'localhost')
data_out = (c_double*3)(); data_in = (c_double*3)();
while True:
rv = gcs.comm_exchange(byref(socket_id), data_in, data_out)
if rv == communication_return_code['SUCCESS']:
print('received data_out :\t%lf\t%lf\t%lf\n' % tuple(data_out))
else:
errmsg = some_function(rv)
print('Error: %s\n' % errmsg)
break
当在交互式Python提示符中运行时,comm_exchange每次都按预期更新data_out数组(它的工作次数与我尝试的次数相同)。但是,当作为脚本运行时,它仅更新data_out数组一次,然后在第二次交换调用时发生连接错误。问题是我无法追踪导致库中连接错误的原因,因为我没有库的来源。
我尝试过的事情:
- 用零填充data_in和data_out,但这似乎是不必要的(在脚本运行时打印它们也显示为零,当我没有明确地这样做时)
- 使用byref
和pointer
以不同方式传递socket_id和数据结构,而不是addressof
。任何工作代码都给出了相同的结果,没有改进。
- 垃圾收集:尝试使用gc.disable()
将其关闭,使用global
替换gcs。没有注意到效果
有关如何解决此问题的任何想法?
Python 2.5.4,ctypes 1.0.3(由于其他依赖性,无法升级Python)。