Python ctypes DLL方法调用以交互方式工作,只有一个调用作为脚本

时间:2014-11-01 00:22:08

标签: python dll ctypes

我需要使用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,但这似乎是不必要的(在脚本运行时打印它们也显示为零,当我没有明确地这样做时) - 使用byrefpointer以不同方式传递socket_id和数据结构,而不是addressof。任何工作代码都给出了相同的结果,没有改进。 - 垃圾收集:尝试使用gc.disable()将其关闭,使用global替换gcs。没有注意到效果

有关如何解决此问题的任何想法?

Python 2.5.4,ctypes 1.0.3(由于其他依赖性,无法升级Python)。

0 个答案:

没有答案