设为首页 收藏本站
查看: 1486|回复: 0

[经验分享] 用python ctypes调用动态链接库

[复制链接]

尚未签到

发表于 2017-4-28 12:47:05 | 显示全部楼层 |阅读模式
ctypes is very cool! Great piece of work.
           - Just van Rossum

ctypes使得python能够直接调用c语言开发的动态链接库,非常强大。
为了使用CTypes,你必须依次完成以下步骤:
    * 编写动态连接库程序
    * 载入动态连接库
    * 将Python的对象转换为ctypes所能识别的参数
    * 使用ctypes的参数调用动态连接库中的函数
来个简单的实例吧:
1. 编写动态链接库

// filename: foo.c
#include <stdio.h>
char* myprint(char *str)
{
puts(str);
return str;
}
float add(float a, float b)
{
return a + b;
}

以上foo.c代码,linux下编译为动态链接库文件,命令是:

gcc -fPIC -shared foo.c -o foo.so


2. ctypes调用

#!/usr/bin/env python
# FILENAME: foo.py
from ctypes import *
foo = CDLL('./foo.so')
myprint = foo.myprint
myprint.argtypes = [POINTER(c_char)] # 参数类型,为char指针
myprint.restype = c_char_p # 返回类型,同样为char指针
res = myprint('hello')
print res
add = foo.add
add.argtypes = [c_float, c_float] # 参数类型,两个float(c_float内ctypes类型)
add.restype = c_float
print add(1.3, 4.2)


文档请参考http://docs.python.org/library/ctypes.html
3. 查找链接库

>>> from ctypes.util import find_library
>>> find_library("m")
'libm.so.6'
>>> find_library("c")
'libc.so.6'
>>> find_library("bz2")
'libbz2.so.1.0'
>>>


调用libc里的printf:

#filename: printf_example.py
import ctypes
from ctypes.util import find_library
printf = ctypes.CDLL(find_library("c")).printf
printf("hello, world\n")

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-370448-1-1.html 上篇帖子: 【转】 在IE中使用Python作为开发脚本 下篇帖子: 大蟒蛇Python平台相关知识
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表