如何使用ctypes在python中来回传递void *到共享库?

时间:2013-10-04 01:45:28

标签: python c ctypes

我认为基本流程是:

from ctypes import *

LEAP = ctypes.CDLL('leap.dylib')

leap_controller = LEAP.leap_controller
leap_controller.res_type = c_void_p

leap_controller_dispose = LEAP.leap_controller_dispose
leap_controller_dispose.argtype = [c_void_p]

但是,当我调用此代码时,它会破坏void *指针。从相关的C代码调试,我得到:

doug:test doug$ python test.py
Controller init!
returning: 0x7fcf9a0022c0
Created controller

Controller dispose!
argument: 0xffffffff9a0022c0
Segmentation fault: 11

显然free()调用失败,因为指针不对。

我已经尝试了几个变体,例如,定义一个结构,如:

class LEAP_CONTROLLER(Structure):
  _fields_ = [
      ("data", c_void_p)
  ]

leap_controller = LEAP.leap_controller
leap_controller.res_type = POINTER(LEAP_CONTROLLER)

leap_controller_dispose = LEAP.leap_controller_dispose
leap_controller_dispose.argtype = [POINTER(LEAP_CONTROLLER)]

...但结果似乎总是一样的。

Python读取指针,但只保留32位数据,并返回一个断开的指针,其余位全部为1.

两个二进制文件都是64位:

Non-fat file: /usr/local/bin/python is architecture: x86_64
Non-fat file: ../../dll/libcleap.dylib is architecture: x86_64

我在这里看到了这个古老的问题: http://bugs.python.org/issue1703286

...但它被标记为已解决。

其他一些随机邮件这个帖子似乎提到了ctypes将64位指针截断为32位'但人们似乎都没有做任何事情就神奇地解决了他们的问题(' it现在工作')或没有回答他们的问题。

任何人都知道我做错了什么?

1 个答案:

答案 0 :(得分:0)

根据评论回答;这是我代码中的拼写错误。

 Per the docs, it's argtypes and restype, not argtype and res_type. –  eryksun Oct 4 at 2:31