python调用C动态库导出函数的返回值为指针类型时,在64位python环境下被截断解决方法

2015年8月20日 16:57:11
     又为一个问题浪费了两天的时间:
     问题描述如下:染色日志库通过ctype导入,在64位的linux系统中只有主线程能正常使用,子线程创建日志对象并使用都会出错,报段错误。
     问题的最终原因:64位的地址被python向int转换发生截断。
          class my_void_p(c_void_p):
              pass
          
          def sslog_create_instance():
              #直接指定 restype=c_void_p在64位上还是会发生地址截断,而让其为一个c_void_p的子类型时可以避免向int的转换,最终达到目的。
              #参见:http://cache.baiducontent.com/c?m=9d78d513d9810ae902b0c8690d679731584381137a9c924268d4e24c95701c011969b9fd61600705a0d8612647fc1805b7b46132635d7df28cc8ff1b80e48f6b68df66722b41da000fd01ca5cd4426c7268d1fb3e40ee7cca66fc4efc5d3a915048c155e26d5e78b2c5152812da75526e3d0cf164b4810ccb97739ae1f2c74c33440c007aea1742545d6e1dd2a1dd42aa6254cccf922b04850a213d25f4c6203e010a60827786dbc1a&p=8371c54ad5c145ec11be9b7c4b509c&newp=882a9647d29a1ff90be2962f1c5d94231610db2151d4d310268ac5&user=baidu&fm=sc&query=python+restype+64&qid=b444bb0400000679&p1=2
              func_sslog_create_instance = anylog_dll.sslog_create_instance
              func_sslog_create_instance.restype = my_void_p
              handle = func_sslog_create_instance()
          #    if sys.platform == "win32":
          #        handle = anylog_dll.sslog_create_instance()
          #    else:
          #        #64位python上会出现sslog_create_instance()返回的void*=被解析成int的问题,这是我自己增加一个函数
          #        handle = c_void_p()
          #        phandle = pointer(handle)
          #        anylog_dll.sslog_create_instance_ex(phandle)
          #    #print "sslog_create_instance:", handle.value
              return handle
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值