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 Matplotlib画图之调整字体大小的示例
Nov 20 Python
numpy中矩阵合并的实例
Jun 15 Python
python实现决策树分类
Aug 30 Python
Python两台电脑实现TCP通信的方法示例
May 06 Python
Python语法分析之字符串格式化
Jun 13 Python
Django对models里的objects的使用详解
Aug 17 Python
Python API自动化框架总结
Nov 12 Python
python flask中动态URL规则详解
Nov 22 Python
基于python实现微信好友数据分析(简单)
Feb 16 Python
Python print不能立即打印的解决方式
Feb 19 Python
使用anaconda安装pytorch的实现步骤
Sep 03 Python
python中opencv实现图片文本倾斜校正
Jun 11 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 友好URL的实现(吐血推荐)
2008/10/04 PHP
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
PHPThumb PHP 图片缩略图库
2012/03/11 PHP
显示程序执行时间php函数代码
2013/08/29 PHP
浅析php原型模式
2014/11/25 PHP
php实现用于计算执行时间的类实例
2015/04/18 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
学习php设计模式 php实现抽象工厂模式
2015/12/07 PHP
浅析Yii2集成富文本编辑器redactor实例教程
2016/04/25 PHP
PHP7+Nginx的配置与安装教程详解
2016/05/10 PHP
javascript实现划词标记+划词搜索功能
2007/03/06 Javascript
深入探讨JavaScript String对象
2015/03/09 Javascript
js点击文本框弹出可选择的checkbox复选框
2016/02/03 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
Js删除数组中某一项或几项的几种方法(推荐)
2016/07/27 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
TypeScript基础入门教程之三重斜线指令详解
2018/10/22 Javascript
json 带斜杠时如何解析的实现
2019/08/12 Javascript
原生小程序封装跑马灯效果
2020/10/21 Javascript
Python中的一些陷阱与技巧小结
2015/07/10 Python
详解Python编程中对Monkey Patch猴子补丁开发方式的运用
2016/05/27 Python
python使用标准库根据进程名如何获取进程的pid详解
2017/10/31 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
python队列queue模块详解
2018/04/27 Python
Python缓存技术实现过程详解
2019/09/25 Python
英国旅游额外服务市场领导者:Holiday Extras(机场停车场、酒店、接送等)
2017/10/07 全球购物
Under Armour安德玛英国官网:美国高端运动科技品牌
2018/09/17 全球购物
ORLY官网:美国专业美甲一线品牌
2019/12/11 全球购物
经典公益广告词
2014/03/13 职场文书
升职自我推荐信范文
2015/03/25 职场文书
2016入党培训心得体会范文
2016/01/08 职场文书
详解MySQL的Seconds_Behind_Master
2021/05/18 MySQL
解决Navicat for Mysql连接报错1251的问题(连接失败)
2021/05/27 MySQL
Django rest framework如何自定义用户表
2021/06/09 Python
Vue h函数的使用详解
2022/02/18 Vue.js