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实现下载网易云音乐的高清MV
Mar 16 Python
Python抓取框架 Scrapy的架构
Aug 12 Python
详解Python实现按任意键继续/退出的功能
Aug 19 Python
Python数据分析之获取双色球历史信息的方法示例
Feb 03 Python
python版本五子棋的实现代码
Dec 11 Python
深入学习python多线程与GIL
Aug 26 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
Sep 18 Python
python argparse模块通过后台传递参数实例
Apr 20 Python
python函数调用,循环,列表复制实例
May 03 Python
在python中使用pyspark读写Hive数据操作
Jun 06 Python
keras分类模型中的输入数据与标签的维度实例
Jul 03 Python
Pygame Time时间控制的具体使用详解
Nov 17 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
smarty的section嵌套循环用法示例
2016/05/28 PHP
php+Memcached实现简单留言板功能示例
2017/02/15 PHP
JS控件autocomplete 0.11演示及下载 1月5日已更新
2007/01/09 Javascript
Javascript常考语句107条收集
2010/03/09 Javascript
使用jQuery jqPlot插件绘制柱状图
2014/12/18 Javascript
jquery实现邮箱自动填充提示功能
2015/11/17 Javascript
JavaScript 数组中最大最小值
2016/06/05 Javascript
Bootstrap中的表单验证插件bootstrapValidator使用方法整理(推荐)
2016/06/21 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
AngularJS实现进度条功能示例
2017/07/05 Javascript
vue在使用ECharts时的异步更新和数据加载详解
2017/11/22 Javascript
使用angularjs.foreach时return的问题解决
2018/09/30 Javascript
JS实现判断有效的数独算法示例
2019/02/25 Javascript
使用vue自定义指令开发表单验证插件validate.js
2019/05/23 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
JS关闭子窗口并且刷新上一个窗口的实现示例
2020/03/10 Javascript
vue select 获取value和lable操作
2020/08/28 Javascript
python查找目录下指定扩展名的文件实例
2015/04/01 Python
在windows系统中实现python3安装lxml
2016/03/23 Python
浅谈python抛出异常、自定义异常, 传递异常
2016/06/20 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
浅谈解除装饰器作用(python3新增)
2018/10/15 Python
python 返回列表中某个值的索引方法
2018/11/07 Python
Python 读取用户指令和格式化打印实现解析
2019/09/02 Python
基于Python实现大文件分割和命名脚本过程解析
2019/09/29 Python
Python3常见函数range()用法详解
2019/12/30 Python
Python通过递归函数输出嵌套列表元素
2020/10/15 Python
时尚的CSS3进度条效果
2012/02/22 HTML / CSS
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
Java文件和目录(IO)操作
2014/08/26 面试题
大学生自我评价怎样写好
2013/10/23 职场文书
化学工程专业求职信
2014/08/10 职场文书
2015年网络舆情工作总结
2015/07/24 职场文书
2016教师节感恩话语
2015/12/09 职场文书
职场干货:简历中的自我评价应该这样写!
2019/05/06 职场文书
CSS文本阴影 text-shadow 悬停效果详解
2022/05/25 HTML / CSS