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 相关文章推荐
Mac 上切换Python多版本
Jun 17 Python
使用python生成目录树
Mar 29 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
Jul 25 Python
10 行 Python 代码教你自动发送短信(不想回复工作邮件妙招)
Oct 11 Python
Django保护敏感信息的方法示例
May 09 Python
Python控制Firefox方法总结
Jun 03 Python
基于django传递数据到后端的例子
Aug 16 Python
python图像处理模块Pillow的学习详解
Oct 09 Python
Python标准库itertools的使用方法
Jan 17 Python
JAVA SWT事件四种写法实例解析
Jun 05 Python
详解Anaconda安装tensorflow报错问题解决方法
Nov 01 Python
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
Jun 07 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
CodeIgniter中实现泛域名解析
2014/07/19 PHP
Laravel 实现Controller向blade前台模板赋值的四种方式小结
2019/10/22 PHP
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
自己动手制作jquery插件之自动添加删除行的实现
2011/10/13 Javascript
javascript学习笔记(十二) RegExp类型介绍
2012/06/20 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
2014/04/17 Javascript
详解JavaScript中常用的函数类型
2015/11/18 Javascript
js获取当前日期时间及其它日期操作汇总
2016/03/08 Javascript
深入理解JavaScript程序中内存泄漏
2016/03/17 Javascript
Vue.js实现一个todo-list的上移下移删除功能
2017/06/26 Javascript
利用javascript如何随机生成一定位数的密码
2017/09/22 Javascript
JavaScript中错误正确处理方式小结你用对了吗
2017/10/10 Javascript
Vue表单demo v-model双向绑定问题
2018/06/29 Javascript
Vue弹出菜单功能的实现代码
2018/09/12 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
2019/11/25 Javascript
vue自定义指令限制输入框输入值的步骤与完整代码
2020/08/30 Javascript
Python装饰器decorator用法实例
2014/11/10 Python
MySQL最常见的操作语句小结
2015/05/07 Python
python selenium firefox使用详解
2019/02/26 Python
python生成器推导式用法简单示例
2019/10/08 Python
TensorFlow——Checkpoint为模型添加检查点的实例
2020/01/21 Python
Pycharm IDE的安装和使用教程详解
2020/04/30 Python
Python pip使用超时问题解决方案
2020/08/03 Python
Python 中 sorted 如何自定义比较逻辑
2021/02/02 Python
英国领先的亚洲旅游专家:Wendy Wu Tours
2018/01/21 全球购物
不开辟用于交换数据的临时空间,如何完成字符串的逆序
2012/12/02 面试题
如何查找网页漏洞
2016/06/22 面试题
小区门卫工作职责
2013/12/14 职场文书
法定代表人授权委托书范文
2014/08/02 职场文书
农业局党的群众路线教育实践活动整改方案
2014/09/20 职场文书
致百米运动员广播稿5篇
2014/10/13 职场文书
朋友聚会祝酒词
2015/08/10 职场文书
五星级酒店宣传口号
2015/12/25 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
使用numpy nonzero 找出非0元素
2021/05/14 Python
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫