我认为基本流程是:
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现在工作')或没有回答他们的问题。
任何人都知道我做错了什么?
答案 0 :(得分:0)
根据评论回答;这是我代码中的拼写错误。
Per the docs, it's argtypes and restype, not argtype and res_type. – eryksun Oct 4 at 2:31