Python调用C扩展尝鲜

写了快一年的Python了,还没写过与C混合编程,最近在用zookeeper做服务发现,刚好就写点代码调用zookeeper的动态链接库咯。首先了解一下动态链接库,使用 nm libzookeeper_mt.so 查看动态链接库里面包含了哪些函数调用,结果示例如下:

00000000000101c0 T zoo_set_debug_level
000000000000ffb0 T zoo_set_log_stream
0000000000009a00 T zoo_set_op_init
0000000000005ca0 T zoo_set_watcher
00000000000079c0 T zoo_state
00000000000109a0 T zoo_unlock_auth
000000000000b560 T zoo_wexists
000000000000b680 T zoo_wget
000000000000b900 T zoo_wget_children

其中T类表示函数是当前库中定义的,U类表示函数是被调用的,在其它库中定义的,W类是当前库中定义,被其它库中的函数覆盖,通过 ldd libzookeeper_mt.so 查看动态链接库依赖了哪些其他的库,动态链接库的详细解释请看这里。

然后就是找几个可以调用的函数来测试了,要知道那些函数需要什么参数需要到C源码里面找,在解压目录下src/c/include/zookeeper.h这个文件里面含有链接库的定义信息。使用

cat ./include/zookeeper.h|grep -v "\/\*\*" |grep -v "^\ \*\ "|grep -v ^$|grep -v "^\ \*\/"

命令过滤源码中的注释信息,找到zoo_wget_children的函数定义:

ZOOAPI int zoo_wget_children(zhandle_t *zh, const char *path,  watcher_fn watcher, void* watcherCtx, 

struct String_vector *strings);

然后就可以准备调用函数了:

import ctypes

lib = ctypes.CDLL("libzookeeper_mt.so")

然后构造所需要的参数,我去,这些个参数有点多,有点难搞啊,找一个简单一点的??

ZOOAPI const char* zerror(int c);这个简单点,然后开始测试

import ctypes 
lib = ctypes.CDLL("libzookeeper_mt.so")
lib.zerror.argtypes = ctypes.c_int <----这个打错了,应该是lib.zerror.argtype,因为只有一个参数,输入参数类型,一个参数的话使用argtype
lib.zerror.restype = ctypes.c_char_p #返回数据类型
result = lib.zerror(2)
print(result) #No such file or directory
ccharp = ctypes.cast(result, ctypes.c_char_p)
print(type(result)) #<type 'str'>
print(ccharp) #c_char_p(140253025734612)
print(ccharp.value) #No such file or directory
#-----------上面参数错误报错信息如下------------
'''
报错:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    lib.zerror.argtypes = (ctypes.c_uint) 
TypeError: _argtypes_ must be a sequence of types
'''
----------------------------

检查发现是在lib.zerror.argtypes = ctypes.c_int 中argtype多了一个s,应该是lib.zerror.argtype = ctypes.c_int,这样就可以顺利调用了,到此测试成功,附加几个链接

Python 调用动态链接库 - 縌兲孓 - CSDN博客

python中ctypes的使用 - m0_37822019的博客 - CSDN博客

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值