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创建线程示例
May 06 Python
Python获取linux主机ip的简单实现方法
Apr 18 Python
python利用正则表达式搜索单词示例代码
Sep 24 Python
Python 数据处理库 pandas进阶教程
Apr 21 Python
python实现搜索文本文件内容脚本
Jun 22 Python
使用Python抓取豆瓣影评数据的方法
Oct 17 Python
详解python使用turtle库来画一朵花
Mar 21 Python
关于pytorch处理类别不平衡的问题
Dec 31 Python
通过Python实现Payload分离免杀过程详解
Jul 13 Python
利用Python函数实现一个万历表完整示例
Jan 23 Python
详解解Django 多对多表关系的三种创建方式
Aug 23 Python
利用 Python 的 Pandas和 NumPy 库来清理数据
Apr 13 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
实现“上一页”和“下一页按钮
2006/10/09 PHP
调用WordPress函数统计文章访问量及PHP原生计数器的实现
2016/03/21 PHP
PHP实现导出excel数据的类库用法示例
2016/10/15 PHP
Javascript调试工具(下载)
2007/01/09 Javascript
IE6不能修改NAME问题的解决方法
2010/09/03 Javascript
JavaScript程序员应该知道的45个实用技巧
2014/03/04 Javascript
jQuery实现鼠标经过提示信息的地图热点效果
2015/04/26 Javascript
JavaScript中的toLocaleDateString()方法使用简介
2015/06/12 Javascript
微信小程序 图片宽度自适应的实现
2017/04/06 Javascript
jquery.rotate.js实现可选抽奖次数和中奖内容的转盘抽奖代码
2017/08/23 jQuery
Js利用console计算代码运行时间的方法示例
2017/09/24 Javascript
vue.js-div滚动条隐藏但有滚动效果的实现方法
2018/03/03 Javascript
微信公众号H5支付接口调用方法
2019/01/10 Javascript
JavaScript寄生组合式继承原理与用法分析
2019/01/11 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
2019/03/29 Javascript
详解Vue中组件传值的多重实现方式
2019/08/16 Javascript
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
python类:class创建、数据方法属性及访问控制详解
2016/07/25 Python
神经网络python源码分享
2017/12/15 Python
python针对不定分隔符切割提取字符串的方法
2018/10/26 Python
Python中字符串List按照长度排序
2019/07/01 Python
Python PIL读取的图像发生自动旋转的实现方法
2019/07/05 Python
详解python实现小波变换的一个简单例子
2019/07/18 Python
浅谈python3中input输入的使用
2019/08/02 Python
Django中使用haystack+whoosh实现搜索功能
2019/10/08 Python
python 如何去除字符串头尾的多余符号
2019/11/19 Python
python在CMD界面读取excel所有数据的示例
2020/09/28 Python
使用Python封装excel操作指南
2021/01/29 Python
印度低票价航空公司:GoAir
2017/10/11 全球购物
策划助理岗位职责
2013/11/18 职场文书
工程班组长岗位职责
2013/12/30 职场文书
与美同行演讲稿
2014/09/13 职场文书
校园广播稿精选
2014/10/01 职场文书
2014年大学生村官工作总结
2014/11/19 职场文书
鼋头渚导游词
2015/02/05 职场文书
员工工作表现自我评价
2015/03/06 职场文书