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 相关文章推荐
C#返回当前系统所有可用驱动器符号的方法
Apr 18 Python
Python解析并读取PDF文件内容的方法
May 08 Python
python查看模块安装位置的方法
Oct 16 Python
python+flask实现API的方法
Nov 21 Python
pycharm debug功能实现跳到循环末尾的方法
Nov 29 Python
Python数据类型之列表和元组的方法实例详解
Jul 08 Python
python脚本之一键移动自定格式文件方法实例
Sep 02 Python
Django对接支付宝实现支付宝充值金币功能示例
Dec 17 Python
Python更换pip源方法过程解析
May 19 Python
matplotlib基础绘图命令之imshow的使用
Aug 13 Python
理解深度学习之深度学习简介
Apr 14 Python
Pytorch distributed 多卡并行载入模型操作
Jun 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
实现分十页分向前十页向后十页的处理
2006/10/09 PHP
PHP笔记之:日期函数的使用介绍
2013/04/24 PHP
测试php函数的方法
2013/11/13 PHP
PHP实现求解最长公共子串问题的方法
2017/11/17 PHP
JS getStyle获取最终样式函数代码
2010/04/01 Javascript
extjs中grid中嵌入动态combobox的应用
2011/01/01 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
jqGrid中文文档之选项设置
2015/12/02 Javascript
js多功能分页组件layPage使用方法详解
2016/05/19 Javascript
Javascript之Number对象介绍
2016/06/07 Javascript
jQuery包裹节点用法完整示例
2016/09/13 Javascript
bootstrap table配置参数例子
2017/01/05 Javascript
js中作用域的实例解析
2017/03/16 Javascript
react.js 获取真实的DOM节点实例(必看)
2017/04/17 Javascript
angular2中使用第三方js库的实例
2018/02/26 Javascript
Angular事件之不同组件间传递数据的方法
2018/11/15 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
Node.js API详解之 dns模块用法实例分析
2020/05/15 Javascript
[09:34]2018DOTA2国际邀请赛寻真——永不放弃的iG
2018/08/14 DOTA
OpenCV实现人脸识别
2017/04/07 Python
wxPython窗体拆分布局基础组件
2019/11/19 Python
基于Python爬取fofa网页端数据过程解析
2020/07/13 Python
复古风格的女装和装饰品:ModCloth
2017/12/29 全球购物
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
巴西备受欢迎的服装和生活方式品牌:FARM Rio
2020/02/04 全球购物
Java 中访问数据库的步骤?Statement 和PreparedStatement 之间的区别?
2012/06/05 面试题
农业开发项目建议书
2014/05/16 职场文书
房产授权委托书范本
2014/09/22 职场文书
运动会报道稿300字
2014/10/02 职场文书
北京英语导游词
2015/02/12 职场文书
地道战观后感500字
2015/06/04 职场文书
人代会简报
2015/07/21 职场文书
幼儿园中班教育随笔
2015/08/14 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书
Pycharm连接远程服务器并远程调试的全过程
2021/06/24 Python