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 相关文章推荐
Python3实现的腾讯微博自动发帖小工具
Nov 11 Python
Python中zip()函数用法实例教程
Jul 31 Python
python多线程用法实例详解
Jan 15 Python
pymongo实现控制mongodb中数字字段做加法的方法
Mar 26 Python
Python实例一个类背后发生了什么
Feb 09 Python
用Python编写简单的微博爬虫
Mar 04 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
Jun 14 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
Python之循环结构
Jan 15 Python
使用OpenCV实现仿射变换—旋转功能
Aug 29 Python
pytho matplotlib工具栏源码探析一之禁用工具栏、默认工具栏和工具栏管理器三种模式的差异
Feb 25 Python
解决pytorch-gpu 安装失败的记录
May 24 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 一个页面执行时间类代码
2010/03/05 PHP
php一些错误处理的方法与技巧总结
2013/08/10 PHP
php代码检查代理ip的有效性
2016/08/19 PHP
PDO::getAttribute讲解
2019/01/28 PHP
php判断目录存在的简单方法
2019/09/26 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
JavaScript高级程序设计 学习笔记 js高级技巧
2011/09/20 Javascript
15个款优秀的 jQuery 图片特效插件推荐
2011/11/21 Javascript
使用nodejs开发cli项目实例
2015/06/03 NodeJs
用原生js统计文本行数的简单示例
2016/08/19 Javascript
老生常谈angularjs中的$state.go
2017/04/24 Javascript
React进阶学习之组件的解耦之道
2017/08/07 Javascript
vue使用element-ui的el-input监听不了回车事件的解决方法
2018/01/12 Javascript
[原创]jQuery实现合并/追加数组并去除重复项的方法
2018/04/11 jQuery
vue源码学习之Object.defineProperty对象属性监听
2018/05/30 Javascript
微信小程序 scroll-view的使用案例代码详解
2020/06/11 Javascript
[05:07]DOTA2英雄梦之声_第14期_暗影恶魔
2014/06/20 DOTA
[00:35]DOTA2上海特级锦标赛 Newbee战队宣传片
2016/03/03 DOTA
python修改list中所有元素类型的三种方法
2018/04/09 Python
windows下python和pip安装教程
2018/05/25 Python
softmax及python实现过程解析
2019/09/30 Python
Django-xadmin后台导入json数据及后台显示信息图标和主题更改方式
2020/03/11 Python
解决python执行较大excel文件openpyxl慢问题
2020/05/15 Python
Python如何读写二进制数组数据
2020/08/01 Python
深入了解Python装饰器的高级用法
2020/08/13 Python
python安装及变量名介绍详解
2020/12/12 Python
python asyncio 协程库的使用
2021/01/21 Python
用css3实现当鼠标移进去时当前亮其他变灰效果
2014/04/08 HTML / CSS
Theo + George官方网站:都柏林时尚品牌
2019/04/08 全球购物
时尚、社区、科技:SEVENSTORE
2019/04/26 全球购物
网友共享的几个面试题关于Java和Unix等方面的
2016/09/08 面试题
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
工业设计毕业生自荐信
2014/04/13 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
Pyhton模块和包相关知识总结
2021/05/12 Python