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

来源:互联网 发布:网络舆论的影响答案 编辑:程序博客网 时间:2024/05/29 15:57
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
0 0
原创粉丝点击