首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用ctype将void *来回传递给python中的共享库?

如何使用ctype将void *来回传递给python中的共享库?
EN

Stack Overflow用户
提问于 2013-10-04 01:45:27
回答 1查看 153关注 0票数 0

我相信基本的程序是:

代码语言:javascript
复制
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代码进行调试,我得到:

代码语言:javascript
复制
doug:test doug$ python test.py
Controller init!
returning: 0x7fcf9a0022c0
Created controller

Controller dispose!
argument: 0xffffffff9a0022c0
Segmentation fault: 11

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

我尝试过一些不同的方法,例如,定义一个结构,比如:

代码语言:javascript
复制
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)]

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

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

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

代码语言:javascript
复制
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

...but标记为“已解决”。

其他一些随机邮寄这个线程似乎提到了ctype‘截断64位指针到32位’,但人们似乎都神奇地解决了他们的问题,没有做任何事情(‘它现在工作’)或没有得到他们的问题的答案。

有人知道我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-12 11:59:50

按照注释回答;这是我的代码中的一个错误。

代码语言:javascript
复制
 Per the docs, it's argtypes and restype, not argtype and res_type. –  eryksun Oct 4 at 2:31 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19171864

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档