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创建日历实例
Aug 21 Python
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
Jul 01 Python
python 网络编程详解及简单实例
Apr 25 Python
Python win32com 操作Exce的l简单方法(必看)
May 25 Python
Python实现的文本编辑器功能示例
Jun 30 Python
socket + select 完成伪并发操作的实例
Aug 15 Python
Python3 修改默认环境的方法
Feb 16 Python
【python】matplotlib动态显示详解
Apr 11 Python
python 中的列表生成式、生成器表达式、模块导入
Jun 19 Python
Python使用get_text()方法从大段html中提取文本的实例
Aug 27 Python
Python autoescape标签用法解析
Jan 17 Python
关于python中remove的一些坑小结
Jan 04 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 Smarty生成EXCEL文档的代码
2008/08/23 PHP
php动态实现表格跨行跨列实现代码
2012/11/06 PHP
Yii中Model(模型)的创建及使用方法
2015/12/28 PHP
Laravel5框架添加自定义辅助函数的方法
2018/08/01 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
2019/10/03 PHP
通过ifame指向的页面高度调整iframe的高度
2006/10/05 Javascript
jQuery Mobile 导航栏代码
2013/11/01 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
ie8本地图片上传预览示例代码
2014/01/12 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
JS实现弹性漂浮效果的广告代码
2015/09/02 Javascript
BootStrap 附加导航组件
2016/07/22 Javascript
JavaScript实现类似拉勾网的鼠标移入移出效果
2016/10/27 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
React和Vue中监听变量变化的方法
2018/11/14 Javascript
vue实现搜索功能
2019/05/28 Javascript
bootstrap Table实现合并相同行
2019/07/19 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
[28:05]完美世界DOTA2联赛循环赛Inki vs DeMonsTer 第一场 10月30日
2020/10/31 DOTA
python实现系统状态监测和故障转移实例方法
2013/11/18 Python
常见的python正则用法实例讲解
2016/06/21 Python
Linux RedHat下安装Python2.7开发环境
2017/05/20 Python
Python2.7+pytesser实现简单验证码的识别方法
2017/12/29 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
Python编程实现tail-n查看日志文件的方法
2019/07/08 Python
Python实现直播推流效果
2019/11/26 Python
pycharm 2020 1.1的安装流程
2020/09/29 Python
在HTML5中如何使用CSS建立不可选的文字
2014/10/17 HTML / CSS
CSS3实现的炫酷菜单代码分享
2015/03/12 HTML / CSS
日本最大的药妆连锁店:Matsukiyo松本清药妆店
2017/11/23 全球购物
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
中国包裹转运寄送国际服务:Famiboat
2019/07/24 全球购物
学院领导推荐信
2013/10/30 职场文书
财务总监管理职责范文
2014/03/09 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
idea下配置tomcat避坑详解
2022/04/12 Servers