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
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
- python调用C动态库导出函数的返回值为指针类型时,在64位python环境下被截断解决方法
- 在C/C++中嵌入python, 用PyImport_ImportModule返回值总是为0的解决方法
- Boost Python 包装C++函数供Python使用时返回值为引用类型的解决方案
- c调用python函数时,解析其返回值
- 使用函数GetProcAddress( )在纯C环境下调用动态链接库的一点心得...
- 函数返回类型为指针类型时
- 函数返回类型为指针类型时的一些问题
- 函数返回类型为指针类型时的一些问题
- 函数返回类型为指针类型时的一些问题
- 函数返回类型为指针类型时的一些问题
- 函数返回类型为指针类型时的一些问题
- 函数返回类型为指针类型时的一些问题
- Linux下Python调用C动态库
- Mac下Python调用C动态库
- C语言函数返回类型为指针时的一些问题
- C语言函数返回类型为指针时的一些问题
- C语言函数返回类型为指针时的一些问题
- C语言函数返回类型为指针时的四个问题
- Bootstrap 栅格系统
- jstat命令详解
- CodeForces 560B Gerald is into Art
- linux进程学习
- Quick to learn Python rules
- python调用C动态库导出函数的返回值为指针类型时,在64位python环境下被截断解决方法
- BST的插入、删除、查找操作
- Sublime Text2/3怎样在Mac OSX中配置CTags插件
- Programming in scala学习笔记(二)Next steps in scala
- java 泛型generic type
- DOM(二)-09-(示例-创建表格-指定行列)
- eclipse中maven项目引入依赖后自动下载源码
- ios开发 加急审核
- POJ 2513 Colored Sticks 欧拉回路+trie树