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 相关文章推荐
python完成FizzBuzzWhizz问题(拉勾网面试题)示例
May 05 Python
30分钟搭建Python的Flask框架并在上面编写第一个应用
Mar 30 Python
在Python的Bottle框架中使用微信API的示例
Apr 23 Python
Python中的choice()方法使用详解
May 15 Python
Python中的字典与成员运算符初步探究
Oct 13 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 Python
Python 使用PIL中的resize进行缩放的实例讲解
Aug 03 Python
基于python3 pyQt5 QtDesignner实现窗口化猜数字游戏功能
Jul 15 Python
python异常触发及自定义异常类解析
Aug 06 Python
Python 实现判断图片格式并转换,将转换的图像存到生成的文件夹中
Jan 13 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
Jun 29 Python
C3 线性化算法与 MRO之Python中的多继承
Oct 05 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
PHP引用(&)各种使用方法实例详解
2014/03/20 PHP
php文件上传类完整实例
2016/05/14 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
javascript 运算数的求值顺序
2011/08/23 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
jquery实现简单的拖拽效果实例兼容所有主流浏览器
2013/06/21 Javascript
JS图片切换的具体方法(带缩略图版)
2013/11/12 Javascript
iframe里使用JavaScript控制主页转向的方法
2015/04/03 Javascript
javascript实现倒计时并弹窗提示特效
2015/06/05 Javascript
移动端js图片查看器
2016/11/17 Javascript
Angular2.0/4.0 使用Echarts图表的示例代码
2017/12/07 Javascript
基于 D3.js 绘制动态进度条的实例详解
2018/02/26 Javascript
Vue中v-show添加表达式的问题(判断是否显示)
2018/03/26 Javascript
解决vue.js this.$router.push无效的问题
2018/09/03 Javascript
基于纯JS实现多张图片的懒加载Lazy过程解析
2019/10/14 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
微信小程序实现文件预览
2020/10/22 Javascript
[03:33]TI9战队采访 - Infamous
2019/08/20 DOTA
[48:31]DOTA2-DPC中国联赛 正赛 Dynasty vs XG BO3 第一场 2月2日
2021/03/11 DOTA
python中管道用法入门实例
2015/06/04 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
python使用minimax算法实现五子棋
2019/07/29 Python
学Python 3的理由和必要性
2019/11/19 Python
PyTorch学习:动态图和静态图的例子
2020/01/06 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
python 弧度与角度互转实例
2020/04/15 Python
Python通过getattr函数获取对象的属性值
2020/10/16 Python
Boom手表官网:瑞典手表品牌,设计你的手表
2019/03/11 全球购物
哈萨克斯坦最大的时装、鞋子和配饰在线商店:Lamoda.kz
2019/11/19 全球购物
中东最大的在线宠物店:Dubai Pet Food
2020/06/11 全球购物
团组织关系介绍信
2014/01/12 职场文书
高中课前三分钟演讲稿
2014/08/18 职场文书
2014党员民主评议个人思想剖析发言
2014/09/19 职场文书
开展党的群众路线教育实践活动个人对照检查材料
2014/11/05 职场文书
教师培训学习心得体会
2016/01/21 职场文书
MySQL8.0无法启动3534的解决方法
2021/06/03 MySQL