Python在Windows和在Linux下调用动态链接库的教程

 更新时间:2015年08月18日 12:16:26   作者:lrfgjj2  
这篇文章主要介绍了Python在Windows和在Linux下调用动态链接库的教程,在进行Python的CS端编程时经常需要用到,需要的朋友可以参考下

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

结果如下:

2015818121733886.gif (368×95)

我们看到两个结果,第一个是进行计算,第二个是带回一个参数。

当然我们还可以很方便的使用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)

运行结果如下:

2015818121806575.gif (144×160)

相关文章

  • python使用smtplib模块通过gmail实现邮件发送的方法

    python使用smtplib模块通过gmail实现邮件发送的方法

    这篇文章主要介绍了python使用smtplib模块通过gmail实现邮件发送的方法,涉及Python使用smtplib模块发送邮件的相关技巧,非常简单实用,需要的朋友可以参考下
    2015-05-05
  • Python+PyQt5实现数据库表格动态增删改

    Python+PyQt5实现数据库表格动态增删改

    这篇文章主要为大家介绍如何利用Python中的PyQt5模块实现对数据库表格的动态增删改,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-03-03
  • 为了顺利买到演唱会的票用Python制作了自动抢票的脚本

    为了顺利买到演唱会的票用Python制作了自动抢票的脚本

    大麦网,是中国综合类现场娱乐票务营销平台,业务覆盖演唱会、 话剧、音乐剧、体育赛事等领域。但是因为票数有限,还有黄牛们不能丢了饭碗,所以导致了,很多人都抢不到票,那么,今天带大家用Python来制作一个自动抢票的脚本小程序
    2021-10-10
  • Python入门之字典的使用教程

    Python入门之字典的使用教程

    Python字典是一种可变容器模型,且可存储任意类型对象,如字符串、数字、元组等其他容器模型。本文将为大家详细讲讲字典的使用教程,需要的可以参考一下
    2022-09-09
  • qpython3 读取安卓lastpass Cookies

    qpython3 读取安卓lastpass Cookies

    这篇文章主要介绍了qpython3 读取安卓lastpass Cookies的相关资料,需要的朋友可以参考下
    2016-06-06
  • Python内置函数input()示例详解

    Python内置函数input()示例详解

    input()函数是Python中用于获取用户输入的一个简单而强大的工具,它在创建需要用户交互的程序时非常有用,这篇文章主要介绍了Python内置函数input()详解,需要的朋友可以参考下
    2024-04-04
  • Python实现打印九九乘法表的不同方法总结

    Python实现打印九九乘法表的不同方法总结

    这篇文章主要为大家介绍了Python实现打印九九乘法表的几种不同方法,文中的示例代码讲解详细,简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下
    2022-11-11
  • Python subprocess库的使用详解

    Python subprocess库的使用详解

    这篇文章主要介绍了Python subprocess库的使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • pandas实现对一列/多列进行数据区间筛选

    pandas实现对一列/多列进行数据区间筛选

    这篇文章主要介绍了pandas实现对一列/多列进行数据区间筛选方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Pytest之测试命名规则的使用

    Pytest之测试命名规则的使用

    这篇文章主要介绍了Pytest之测试命名规则的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04

最新评论