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计算圆周长、面积、球体体积并画出圆
Apr 08 Python
在Python中使用mechanize模块模拟浏览器功能
May 05 Python
tensorflow中next_batch的具体使用
Feb 02 Python
python 批量修改/替换数据的实例
Jul 25 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
Apr 12 Python
python重要函数eval多种用法解析
Jan 14 Python
pytorch模型存储的2种实现方法
Feb 14 Python
利用Python脚本批量生成SQL语句
Mar 04 Python
Python使用ElementTree美化XML格式的操作
Mar 06 Python
在Tensorflow中实现leakyRelu操作详解(高效)
Jun 30 Python
python 使用建议与技巧分享(四)
Aug 18 Python
Python3使用Qt5来实现简易的五子棋小游戏
May 02 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 5.0对象模型深度探索之对象复制
2008/03/27 PHP
五款常用mysql slow log分析工具的比较分析
2011/05/22 PHP
PHP header()函数使用详细(301、404等错误设置)
2013/04/17 PHP
php cli模式学习(PHP命令行模式)
2013/06/03 PHP
PHP SESSION的增加、删除、修改、查看操作
2015/03/20 PHP
php使用curl打开https网站的方法
2015/06/17 PHP
PHP反射API示例分享
2016/10/08 PHP
PHP在innodb引擎下快速代建全文搜索功能简明教程【基于xunsearch】
2016/10/14 PHP
php基于自定义函数记录log日志方法
2017/07/21 PHP
jQuery EasyUI API 中文文档 - TimeSpinner时间微调器
2011/10/23 Javascript
JavaScript高级程序设计(第3版)学习笔记2 js基础语法
2012/10/11 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
使用documentElement正确取得当前可见区域的大小
2014/07/25 Javascript
javascript Array 数组常用方法
2015/04/05 Javascript
JQuery中DOM事件合成用法实例分析
2015/06/13 Javascript
H5移动端适配 Flexible方案
2016/10/24 Javascript
利用NPM淘宝的node.js镜像加速nvm
2017/03/27 Javascript
vue2 自定义动态组件所遇到的问题
2017/06/08 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
vue实现多个元素或多个组件之间动画效果
2018/09/25 Javascript
深入浅析vue-cli@3.0 使用及配置说明
2019/05/08 Javascript
vue-cli3项目升级到vue-cli4 的方法总结
2020/03/19 Javascript
原生JS实现记忆翻牌游戏
2020/07/31 Javascript
vue组件暴露和.js文件暴露接口操作
2020/08/11 Javascript
Python实现二叉搜索树
2016/02/03 Python
浅谈python装饰器探究与参数的领取
2017/12/01 Python
用Python抢火车票的简单小程序实现解析
2019/08/14 Python
python标准库sys和OS的函数使用方法与实例详解
2020/02/12 Python
python函数调用,循环,列表复制实例
2020/05/03 Python
Python 多进程、多线程效率对比
2020/11/19 Python
使用css3背景渐变中的透明度来设置不同颜色的背景渐变
2014/03/31 HTML / CSS
英国最受信任的在线眼镜商之一:Fashion Eyewear
2019/10/31 全球购物
介绍下Java的输入输出流
2014/01/22 面试题
国税会议欢迎词
2014/01/16 职场文书
工会经费申请报告
2015/05/15 职场文书
职场:企业印章管理制度(模板)
2019/10/18 职场文书