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 相关文章推荐
400多行Python代码实现了一个FTP服务器
May 10 Python
Python 字典(Dictionary)操作详解
Mar 11 Python
python实现根据图标提取分类应用程序实例
Sep 28 Python
Python比较文件夹比另一同名文件夹多出的文件并复制出来的方法
Mar 05 Python
解决Python的str强转int时遇到的问题
Apr 09 Python
Pyspider中给爬虫伪造随机请求头的实例
May 07 Python
解决Python pandas df 写入excel 出现的问题
Jul 04 Python
Python并发之多进程的方法实例代码
Aug 15 Python
详解Python计算机视觉 图像扭曲(仿射扭曲)
Mar 27 Python
Python Django Vue 项目创建过程详解
Jul 29 Python
利用python、tensorflow、opencv、pyqt5实现人脸实时签到系统
Sep 25 Python
Python OpenCV实现测量图片物体宽度
May 27 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
解析dedecms空间迁移步骤详解
2013/05/15 PHP
解析centos中Apache、php、mysql 默认安装路径
2013/06/25 PHP
关于扩展 Laravel 默认 Session 中间件导致的 Session 写入失效问题分析
2016/01/08 PHP
必须收藏的23个php实用代码片段
2016/02/02 PHP
php实现获取近几日、月时间示例
2019/07/06 PHP
jquery获取input的value问题说明
2010/08/19 Javascript
JavaScript高级程序设计(第3版)学习笔记11 内建js对象
2012/10/11 Javascript
JavaScript 函数惰性载入的实现及其优点介绍
2013/08/12 Javascript
使用JavaScript和C#中获得referer
2014/11/14 Javascript
基于javascript数组实现图片轮播
2016/05/02 Javascript
jQuery中的ready函数与window.onload谁先执行
2016/06/21 Javascript
jQuery Dialog 取消右上角删除按钮事件
2016/09/07 Javascript
Vue 2.0入门基础知识之内部指令详解
2017/10/15 Javascript
vue弹窗组件使用方法
2018/04/28 Javascript
记一次vue-webpack项目优化实践详解
2019/02/17 Javascript
JavaScript键盘事件响应顺序详解
2019/09/30 Javascript
Vue + Node.js + MongoDB图片上传组件实现图片预览和删除功能详解
2020/04/29 Javascript
用vue设计一个日历表
2020/12/03 Vue.js
python生成器generator用法实例分析
2015/06/04 Python
Python实现 多进程导入CSV数据到 MySQL
2017/02/26 Python
一个基于flask的web应用诞生 使用模板引擎和表单插件(2)
2017/04/11 Python
详解Numpy中的数组拼接、合并操作(concatenate, append, stack, hstack, vstack, r_, c_等)
2019/05/27 Python
python 实现音频叠加的示例
2020/10/29 Python
HTML5各种头部meta标签的功能(推荐)
2017/03/13 HTML / CSS
英国浴室洗脸盆购物网站:Click Basin
2018/06/08 全球购物
EJB3推出JPA的原因
2013/10/16 面试题
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
初中生考试作弊检讨书
2014/12/14 职场文书
领导干部失职检讨书
2015/05/05 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
Python爬虫基础讲解之请求
2021/05/13 Python
解决SpringCloud Feign传对象参数调用失败的问题
2021/06/23 Java/Android
浅谈Python中的正则表达式
2021/06/28 Python
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
Win11怎么进入安全模式?Windows 11进入安全模式的方法
2021/11/21 数码科技