文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>用python ctypes调用动态链接库

用python ctypes调用动态链接库

时间:2010-05-01  来源:oychw

用python ctypes调用动态链接库
关键字: python ctypes gcc dll linux
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下编译为动态链接库文件,命令是:
Shell 代码

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

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



2. ctypes调用

Python 代码

 
#!/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. 查找链接库

Python 代码

   1. >>> from ctypes.util import find_library 
   2. >>> find_library("m") 
   3. 'libm.so.6' 
   4. >>> find_library("c") 
   5. 'libc.so.6' 
   6. >>> find_library("bz2") 
   7. 'libbz2.so.1.0' 
   8. >>> 

>>> 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:
Python 代码

   1. #filename: printf_example.py 
   2.  
   3. import ctypes 
   4. from ctypes.util import find_library 
   5.  
   6. printf = ctypes.CDLL(find_library("c")).printf 
   7.  
   8. printf("hello, world\n")  
原文地址:http://willzh.javaeye.com/blog/486075
相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载