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删除文件示例分享
Jan 28 Python
python采集博客中上传的QQ截图文件
Jul 18 Python
用Python从零实现贝叶斯分类器的机器学习的教程
Mar 31 Python
Python解析树及树的遍历
Feb 03 Python
Python中turtle作图示例
Nov 15 Python
Python基于TCP实现会聊天的小机器人功能示例
Apr 09 Python
Python Web编程之WSGI协议简介
Jul 18 Python
使用Python制作自动推送微信消息提醒的备忘录功能
Sep 06 Python
keras 读取多标签图像数据方式
Jun 12 Python
使用gunicorn部署django项目的问题
Dec 30 Python
Python实现邮件发送的详细设置方法(遇到问题)
Jan 18 Python
Opencv中cv2.floodFill算法的使用
Jun 18 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页面间传递参数实例代码
2008/06/05 PHP
PHP+javascript制作带提示的验证码源码分享
2014/05/28 PHP
PHP查询快递信息的方法
2015/03/07 PHP
PHP+MYSQL中文乱码问题
2015/07/01 PHP
浅谈PHP中try{}catch{}的使用方法
2016/12/09 PHP
PHP数组操作实例分析【添加,删除,计算,反转,排序,查找等】
2016/12/24 PHP
thinkPHP框架RBAC实现原理分析
2019/02/01 PHP
JavaScript toFixed() 方法
2010/04/15 Javascript
JAVASCRIPT函数作用域和提前声明 分享
2013/08/22 Javascript
js调试工具console.log()方法查看js代码的执行情况
2014/08/08 Javascript
jquery中添加属性和删除属性
2015/06/03 Javascript
一览画面点击复选框后获取多个id值的方法
2016/05/30 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
nodejs对express中next函数的一些理解
2017/09/08 NodeJs
详解NodeJs开发微信公众号
2018/05/25 NodeJs
在webstorm开发微信小程序之使用阿里自定义字体图标的方法
2018/11/15 Javascript
微信小程序实现动态获取元素宽高的方法分析
2018/12/10 Javascript
微信小程序时间轴实现方法示例
2019/01/14 Javascript
在vue中使用echars实现上浮与下钻效果
2019/11/08 Javascript
[02:01]BBC DOTA2国际邀请赛每日综述:八强胜者组鏖战,中国队喜忧参半
2014/07/19 DOTA
从零学python系列之浅谈pickle模块封装和拆封数据对象的方法
2014/05/23 Python
Python 2与Python 3版本和编码的对比
2017/02/14 Python
Scrapy基于selenium结合爬取淘宝的实例讲解
2018/06/13 Python
PyCharm代码回滚,恢复历史版本的解决方法
2018/10/22 Python
python 实现交换两个列表元素的位置示例
2019/06/26 Python
python进阶之自定义可迭代的类
2019/08/20 Python
Python如何实现强制数据类型转换
2019/11/22 Python
python suds访问webservice服务实现
2020/06/26 Python
火山咖啡:Volcanica Coffee
2019/10/29 全球购物
企业为何需要商业计划书
2013/12/26 职场文书
元旦晚会邀请函
2014/02/01 职场文书
安全宣传标语口号
2014/06/06 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
Python爬取用户观影数据并分析用户与电影之间的隐藏信息!
2021/06/29 Python
24年收藏2000多部退役军用电台
2022/02/18 无线电
MySQL数据库 安全管理
2022/05/06 MySQL