python调用第三方动态库(附代码)

摘要

本文讲述python混合编程之调用动态库

引言

python因为良好的编码性和扩展库正被大规模的使用,但他有两个缺点:1、代码可见;2、执行效率低,于是在实际应用中经常会把高效和核心代码用C/C++实现,业务部分用python实现。这就需要进行混合编程,本文对python调用动态库的方法及注意事项进行记录

主题

python标准库函数中提供了调用动态库的包————ctypes

加载动态库

  • 查找动态库ctypes.util.find_library
  • 根据动态库调用方式的不同,可以分为cdeclstdcall两种,这两种方式的主要区别见下表。后面的例子以cdecl调用方式为例,stdcall类同。
调用标准内存栈维护者函数名
cdecl调用者前面加下划线,后面加“@”符号和参数的字节数
stdcall被调用者在输出函数名前面加下划线

* ctypes加载动态库有两种方式。构造类对象libc = CDLL("libtestlib.dll")和实例化instancelibc = cdll.LoadLibrary("libtestlib.dll")。这两种方式都会返回一个动态库操作的句柄,以供后面使用

类型

  • 常规参数类型

C常规参数类型与ctypes、python类型对应关系表如下:

C typectypes typePython type
_Boolc_boolbool (1)
charc_char1-character bytes object
wchar_tc_wchar1-character string
charc_byteint
unsigned charc_ubyteint
shortc_shortint
unsigned shortc_ushortint
intc_intint
unsigned intc_uintint
longc_longint
unsigned longc_ulongint
__int64 or long longc_longlongint
unsigned __int64 or unsigned long longc_ulonglongint
size_tc_size_tint
ssize_t or Py_ssize_tc_ssize_tint
floatc_floatfloat
doublec_doublefloat
long doublec_longdoublefloat
char * (NUL terminated)c_char_pbytes object or None
wchar_t * (NUL terminated)c_wchar_pstring or None
void *c_void_pint or None

* 指针
* 弱引用指针byref(),这种方式速度更快
* 强指针pointer()
* c_types定义的指针c_char_pc_wchar_pc_void_p不可修改,如果需要在C函数中被修改,需要使用函数create_string_buffer()创建可变内存
* 用指针的value属性获取指针指向的内容

  • 结构体/联合体
    • 通过构建类继承Structure/Union来实现结构体的定义,把结构体属性组合成元组数组放在类中的_fields属性中。关于结构体的其它特性(对齐、指针嵌套、位域等)请参照官网

      class POINT(Structure):
      _fields_ = [("x", c_int),
      ("y", c_int)]
      class RECT(Structure):
      _fields_ = [("upperleft", POINT),
      ("lowerright", POINT)]
  • 数组直接使用类型 * 元素个数的方式来定义,如array = c_int * 10

  • 函数指针(回调函数)CFUNCTYPE

    • 使用注释的方式一次定义

      @CFUNCTYPE(c_int, c_int)
      def py_cb_func(a):
          print("py_cb_func", str(a))
          return a + 1
    • 标准方式

      
      # 定义c_types类型
      
      PY_CB_FUNC = CFUNCTYPE(c_int, c_int)
      def py_cb_func(a):
          print("py_cb_func", str(a))
          return a + 1
      cb_func = PY_CB_FUNC(py_cmp_func)

函数

  • 函数入参声明libtest.parm_int.argtypes = [c_int],做了函数声明后,会在python调用时对参数格式进行检查
  • 函数返回值类型声明libtest.parm_int.restype = c_int,做了函数声明后,会在python调用时对参数格式进行检查
  • 函数调用ret = libtest.parm_int(c_int(1))

实例

我专门针对c_types调用动态库写了一个实例。实例包括两个部分
- 用C实现的动态库代码。主要从入参类型、返回值类型、回调函数调用三个方面实现及提供接口
- 用python实现的对动态库调用代码。用于调用动态库的所有接口

附录

参考


  • 5
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: wxPython是一个基于wxWidgets框架的Python GUI,它允许Python开发者使用完全本地的GUI工具包来创建图形用户界面。它提供了一组丰富的控件,支持多种操作系统,如Windows,Mac OS X和Linux。 安装wxPython: 你可以使用pip来安装wxPython。在终端中运行以下命令: ```bash pip install wxPython ``` 当然你也可以通过源码方式安装wxPython,具体的安装步骤可以参考官方文档:https://wxpython.org/pages/downloads/index.html ### 回答2: wxPython 是一个基于Python第三方,用于创建桌面应用程序的图形用户界面(GUI)。它是wxWidgets C++框架的Python封装。 wxPython提供了丰富的控件和强大的事件处理机制,使得开发者可以轻松创建具有丰富视觉效果和交互性的应用程序。它的代码简洁、易于理解,是Python GUI开发的主要选择之一。 通过wxPython,开发者可以创建各种类型的应用程序,从简单的小工具到复杂的商业应用都可以涉及。它支持多平台,可以在Windows、macOS和Linux上运行,提供了跨平台的一致性。 使用wxPython开发应用程序非常方便。首先,你需要安装wxPython。然后,你可以使用wxPython的各种控件(如按钮、文本框、列表框等)进行布局,并将它们放置在窗口中。你还可以通过wxPython的事件绑定机制为这些控件添加功能。例如,你可以为按钮添加点击事件,当用户点击按钮时触发某些操作。 wxPython还提供了丰富的布局管理器,用于自动管理窗口中控件的位置和大小,使得开发者可以更轻松地组织应用程序的界面。 总之,wxPython是一个强大而灵活的GUI开发工具,可以帮助开发者快速构建出色的桌面应用程序。无论你是初学者还是有经验的开发者,都可以借助wxPython轻松实现自己的创意和项目。它的强大功能和简洁易用的API使其成为Python GUI开发的首选工具之一。 ### 回答3: wxPython是一个开源的、跨平台的GUI工具包,它是Python语言的一个第三方,用于创建桌面应用程序的图形用户界面。 wxPython基于C++编写的wxWidgets,提供了一系列的类和方法,使得开发者可以快速构建功能完善的用户界面。它可以运行在多个操作系统上,包括Windows、Mac和Linux等。 使用wxPython,开发者可以创建各种类型的窗口、对话框、按钮、文本框等控件,通过简单的方法调用,实现用户界面的交互和动态更新。这些控件可以被操作,例如点击按钮、更改文本等,从而实现各种功能。 wxPython还提供了许多预定义的事件处理器,可以对用户的操作进行响应,例如点击按钮时执行某些操作。开发者可以根据具体的需求编写相应的代码,处理这些事件。 wxPython还具备绘图功能,可以绘制各种形状、图像和图表,实现数据可视化的效果。此外,还可以集成其他Python,例如访问数据、网络编程等,实现更加丰富的功能。 总之,wxPython是一个功能强大、易于学习的GUI工具包,可以用于快速开发跨平台的桌面应用程序。它结合了Python的简洁和易用性,以及wxWidgets的强大功能,为开发者提供了丰富的工具和资源,使得创建用户友好的应用程序变得更加简单和高效。无论是初学者还是有一定经验的开发者,都可以通过wxPython实现自己的创意和想法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值