Python在Windows和在Linux下调用动态链接库的教程


Posted in Python onAugust 18, 2015

Linux系统下调用动态库(.so)

1、linuxany.c代码如下:

#include "stdio.h"
  void display(char* msg){
    printf("%s\n",msg);
  }
   
  int add(int a,int b){
    return a+b;
  }

2、编译c代码,最后生成Python可执行的.so文件
(1)gcc -c linuxany.c,将生成一个linuxany.o文件
(2)gcc -shared linuxany.c -o linuxany.so,将生成一个linuxany.so文件

3、在Python中调用

#!/usr/bin/python
   
  from ctypes import *
  import os 
  //参数为生成的.so文件所在的绝对路径
  libtest = cdll.LoadLibrary(os.getcwd() + '/linuxany.so') 
  //直接用方法名进行调用
  print 
  libtest.display('Hello,I am linuxany.com') 
  print libtest.add(2,2010)

4、运行结果

Hello,I am linuxany.com
2012

Windows下Python调用dll

python中如果要调用dll,需要用到ctypes模块,在程序开头导入模块 import ctypes

由于调用约定的不同,python调用dll的方法也不同,主要有两种调用规则,即 cdecl和stdcal,还有其他的一些调用约定,关于他们的不同,可以查阅其他资料

先说 stdcal的调用方法:

方法一:

import ctypes
dll = ctypes.windll.LoadLibrary( 'test.dll' )

方法二:

import ctypes
dll = ctypes.WinDll( 'test.dll' )

cdecl的调用方法:

1.

import ctypes
dll = ctypes.cdll.LoadLibrary( 'test.dll' )
##注:一般在linux下为test.o文件,同样可以使用如下的方法:
## dll = ctypes.cdll.LoadLibrary('test.o')

2.

import ctypes
dll = ctypes.CDll( 'test.dll' )

看一个例子,首先编译一个dll

导出函数如下:

# define ADD_EXPORT Q_DECL_EXPORT
extern "C" ADD_EXPORT int addnum(int num1,int num2)
{
return num1+num2;
}


extern "C" ADD_EXPORT void get_path(char *path){
memcpy(path,"hello",sizeof("hello"));
}

这里使用的是cdecl

脚本如下:

dll=ctypes.CDLL("add.dll")
add=dll.addnum
add.argtypes=[ctypes.c_int,ctypes.c_int] #参数类型
add.restypes=ctypes.c_int            #返回值类型
print add(1,2)


get_path=dll.get_path
get_path.argtypes=[ctypes.c_char_p]
path=create_string_buffer(100)
get_path(path)
print path.value

结果如下:

Python在Windows和在Linux下调用动态链接库的教程

我们看到两个结果,第一个是进行计算,第二个是带回一个参数。

当然我们还可以很方便的使用windows的dll,提供了很多接口

GetSystemDirectory = windll.kernel32.GetSystemDirectoryA
buf = create_string_buffer(100)
GetSystemDirectory(buf,100)
print buf.value
MessageBox = windll.user32.MessageBoxW
MessageBox(None, u"Hello World", u"Hi", 0)

运行结果如下:

Python在Windows和在Linux下调用动态链接库的教程

Python 相关文章推荐
Pandas探索之高性能函数eval和query解析
Oct 28 Python
python ansible服务及剧本编写
Dec 29 Python
python之Flask实现简单登录功能的示例代码
Dec 24 Python
Python3实现取图片中特定的像素替换指定的颜色示例
Jan 24 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
Jan 30 Python
Flask框架学习笔记之表单基础介绍与表单提交方式
Aug 12 Python
用Pytorch训练CNN(数据集MNIST,使用GPU的方法)
Aug 19 Python
Tensorflow分批量读取数据教程
Feb 07 Python
python能做哪些生活有趣的事情
Sep 09 Python
python matplotlib绘制三维图的示例
Sep 24 Python
python3 hdf5文件 遍历代码
May 19 Python
python turtle绘制多边形和跳跃和改变速度特效
Mar 16 Python
Python中map,reduce,filter和sorted函数的使用方法
Aug 17 #Python
Nginx搭建HTTPS服务器和强制使用HTTPS访问的方法
Aug 16 #Python
使用Python操作MySQL的一些基本方法
Aug 16 #Python
Python中list列表的一些进阶使用方法介绍
Aug 15 #Python
Python中的super()方法使用简介
Aug 14 #Python
在Python中使用正则表达式的方法
Aug 13 #Python
简单讲解Python中的闭包
Aug 11 #Python
You might like
收音机指标测试方法及仪器
2021/03/01 无线电
php file_exists 检查文件或目录是否存在的函数
2010/05/10 PHP
基于initPHP的框架介绍
2013/04/18 PHP
深入浅析php json 格式控制
2015/12/24 PHP
PHP jQuery+Ajax结合写批量删除功能
2017/05/19 PHP
ThinkPHP防止重复提交表单的方法实例分析
2018/05/10 PHP
使用CSS3实现字体颜色渐变的实现
2021/03/09 HTML / CSS
最佳JS代码编写的14条技巧
2011/01/09 Javascript
jquery图片放大功能简单实现
2013/08/01 Javascript
jquerydom对象的事件隐藏显示和对象数组示例
2013/12/10 Javascript
JS延迟加载加快页面打开速度示例代码
2013/12/30 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
jquery插件tytabs.jquery.min.js实现渐变TAB选项卡效果
2015/08/25 Javascript
JS实现兼容性较好的随屏滚动效果
2015/11/09 Javascript
详解javascript中原始数据类型Null和Undefined
2015/12/17 Javascript
Bootstrap优化站点资源、响应式图片、传送带使用详解3
2016/10/14 Javascript
微信开发 使用picker封装省市区三级联动模板
2016/10/28 Javascript
Reactjs实现通用分页组件的实例代码
2017/01/19 Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
2017/04/21 Javascript
easyui combogrid实现本地模糊搜索过滤多列
2017/05/13 Javascript
JavaScript事件委托原理与用法实例分析
2018/06/07 Javascript
详解ES6中的 Set Map 数据结构学习总结
2018/11/06 Javascript
JavaScript中的ES6 Proxy的具体使用
2019/06/16 Javascript
jquery实现垂直手风琴导航栏
2020/02/18 jQuery
介绍Python中的fabs()方法的使用
2015/05/14 Python
Python中shapefile转换geojson的示例
2019/01/03 Python
python在openstreetmap地图上绘制路线图的实现
2019/07/11 Python
python操作excel让工作自动化
2019/08/09 Python
WSDL的操作类型主要有几种
2013/07/19 面试题
求职信模板怎么做
2014/01/26 职场文书
找工作求职信
2014/07/07 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
仲裁协议书
2014/09/26 职场文书
2016年学校安全教育月活动总结
2016/04/06 职场文书
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript
使用canvas对video视频某一刻截图功能
2021/09/25 HTML / CSS