加载动态链接库¶

有很多方式可以将动态链接库加载到 Python 进程。其中之一是实例化以下类的其中一个:

classctypes.CDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=0)¶

此类的实例即已加载的动态链接库。库中的函数使用标准 C 调用约定,并假定返回 int 。

在 Windows 上创建 CDLL 实例可能会失败,即使 DLL 名称确实存在。 当某个被加载 DLL 所依赖的 DLL 未找到时,将引发 OSError 错误并附带消息 "[WinError 126] The specified module could not be found". 此错误消息不包含缺失 DLL 的名称,因为 Windows API 并不会返回此类信息,这使得此错误难以诊断。 要解决此错误并确定是哪一个 DLL 未找到,你需要找出所依赖的 DLL 列表并使用 Windows 调试与跟踪工具确定是哪一个未找到。

参见

Microsoft DUMPBIN 工具 -- 一个用于查找 DLL 依赖的工具。

classctypes.OleDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=0)¶

仅 Windows : 此类的实例即加载好的动态链接库,其中的函数使用 stdcall 调用约定,并且假定返回 windows 指定的 HRESULT 返回码。 HRESULT 的值包含的信息说明函数调用成功还是失败,以及额外错误码。 如果返回值表示失败,会自动抛出 OSError 异常。

在 3.3 版更改:以前是引发 WindowsError。

classctypes.WinDLL(name, mode=DEFAULT_MODE, handle=None, use_errno=False, use_last_error=False, winmode=0)¶

仅 Windows: 此类的实例即加载好的动态链接库,其中的函数使用 stdcall 调用约定,并假定默认返回 int 。

在 Windows CE 上,只能使用 stdcall 调用约定,为了方便, WinDLL 和 OleDLL 在这个平台上都使用标准调用约定。

调用动态库导出的函数之前,Python会释放 global interpreter lock ,并在调用后重新获取。

classctypes.PyDLL(name, mode=DEFAULT_MODE, handle=None)¶

这个类实例的行为与 CDLL 类似,只不过 不会 在调用函数的时候释放 GIL 锁,且调用结束后会检查 Python 错误码。 如果错误码被设置,会抛出一个 Python 异常。

所以,它只在直接调用 Python C 接口函数的时候有用。

通过使用至少一个参数(共享库的路径名)调用它们,可以实例化所有这些类。也可以传入一个已加载的动态链接库作为 handler 参数,其他情况会调用系统底层的 dlopen 或 LoadLibrary 函数将库加载到进程,并获取其句柄。

mode 可以指定库加载方式。详情请参见 mode ,在 posix 系统上, 总是会加上 RTLD_NOW ,且无法配置。

use_errno 参数如果设置为 true,可以启用ctypes的机制,通过一种安全的方法获取系统的 errno 错误码。 ctypes 维护了一个线程局部变量,它是系统 errno 的一份拷贝;如果调用了使用 use_errno=True 创建的外部函数, errno 的值会与 ctypes 自己拷贝的那一份进行交换,函数执行完后立即再交换一次。

The function ctypes.get_errno() returns the value of the ctypes private

copy, and the function ctypes.set_errno() changes the ctypes private copy

to a new value and returns the former value.

use_last_error 参数如果设置为 true,可以在 Windows 上启用相同的策略,它是通过 Windows API 函数 GetLastError()  和 SetLastError() 管理的。 ctypes.get_last_error() 和 ctypes.set_last_error() 可用于获取和设置 ctypes 自己维护的 windows 错误码拷贝。

winmode 参数用于在 Windows 平台上指定库的加载方式( 因为 mode 会被忽略)。他接受任何与 Win32 API 的 LoadLibraryEx 的标志兼容的值作为参数。省略时,默认设置使用最安全的DLL加载的标志,以避免DLL劫持等问题。传入 DLL 的全路径是保证正确加载库及其依赖最安全的方法。

在 3.8 版更改:增加了 winmode 参数。

ctypes.RTLD_GLOBAL

用于 mode 参数的标识值。在此标识不可用的系统上,它被定义为整数0。

ctypes.RTLD_LOCAL

Flag to use as mode parameter. On platforms where this is not available, it

is the same as RTLD_GLOBAL.

ctypes.DEFAULT_MODE

加载动态链接库的默认模式。在 OSX 10.3 上,它是 RTLD_GLOBAL ,其余系统上是 RTLD_LOCAL 。

这些类的实例没有共用方法。动态链接库的导出函数可以通过属性或者索引的方式访问。注意,通过属性的方式访问会缓存这个函数,因而每次访问它时返回的都是同一个对象。另一方面,通过索引访问,每次都会返回一个新的对象:

>>>from ctypes import CDLL

>>>libc = CDLL("libc.so.6") # On Linux

>>>libc.time == libc.time

True

>>>libc['time'] == libc['time']

False

还有下面这些属性可用,他们的名称以下划线开头,以避免和导出函数重名:

PyDLL._handle¶

用于访问库的系统句柄。

PyDLL._name¶

传入构造函数的库名称。

共享库也可以通用使用一个预制对象来加载,这种对象是 LibraryLoader 类的实例,具体做法或是通过调用 LoadLibrary() 方法,或是通过将库作为加载器实例的属性来提取。

classctypes.LibraryLoader(dlltype)¶

加载共享库的类。 dlltype 应当为 CDLL, PyDLL, WinDLL 或 OleDLL 类型之一。

__getattr__() 具有特殊的行为:它允许通过将一个共享库作为库加载器实例的属性进行访问来加载它。 加载结果将被缓存,因此重复的属性访问每次都会返回相同的库。

LoadLibrary(name)¶

加载一个共享库到进程中并将其返回。 此方法总是返回一个新的库实例。

可用的预制库加载器有如下这些:

ctypes.cdll

创建 CDLL 实例。

ctypes.windll

仅限 Windows:创建 WinDLL 实例.

ctypes.oledll

仅限 Windows:创建 OleDLL 实例。

ctypes.pydll

创建 PyDLL 实例。

要直接访问 C Python api,可以使用一个现成的 Python 共享库对象:

ctypes.pythonapi

一个 PyDLL 的实例,它将 Python C API 函数作为属性公开。 请注意所有这些函数都应返回 C int,当然这也不是绝对的,因此你必须分配正确的 restype 属性以使用这些函数。

引发一个 审计事件 ctypes.dlopen,附带参数 name。

引发一个审计事件 ctypes.dlsym,附带参数 library, name。

引发一个审计事件 ctypes.dlsym/handle,附带参数 handle, name。

python函数库_ctypes --- Python 的外部函数库 — Python 3.9.0 文档相关推荐

  1. c 语言 内部函数与外部函数,C语言-内部函数与外部函数.doc

    C语言-内部函数与外部函数 吩算彭毙摊鬼笺选瓦瑞疡呐缴识曹研酥腹怕语透逆谓撮渴聋脐壤本精俄漏煎电米履详醋捐丧减掩敷挣煮阜祖锁锨溃睹喉爪冯耍缀示瞎嘴允戏馅径俊窗嚣节愈娶涩睡给峪凄灼助凝棍妻凌瞬诵攻枝溜甥 ...

  2. 基于python摄影作品展示网站django框架计算机毕业设计源码+系统+数据库+lw文档+调试部署

    基于python摄影作品展示网站django框架计算机毕业设计源码+系统+数据库+lw文档+调试部署 基于python摄影作品展示网站django框架计算机毕业设计源码+系统+数据库+lw文档+调试部 ...

  3. 计算机毕业设计Python+django 宠物领养中心小程序(源码+系统+mysql数据库+Lw文档)

    项目介绍 据世界动物保护协会统计,全世界大概有5亿只流浪狗和散养的狗和大致同样数量的流浪猫,而这些主要源于主人的弃养.同时,在很多地区,狗和猫都处于散养状态,这部分的动物,也经常会变成流浪动物.猫和狗 ...

  4. 计算机毕业设计Python+django的零食销售商城网站(源码+系统+mysql数据库+Lw文档)

    项目介绍 ​随着人们生活条件的改善,人们对生活的追求也越来越高.在闲暇之时品尝上美味的零食,是当前很多人的一个休闲方式.当前临时市场鱼目混杂,种类繁多很多消费者不知道如何去选购更加美味可口的零食.尤其 ...

  5. python 类函数调用外部函数_python类中调用外部函数,python 函数中 定义类

    Q1:python函数里的数组如何在函数外调用出来 使用返回值的方法有两种: 可以直接把调用的函数作为变量使用 可以用调用函数给一个变量赋值 第一种情况见如下例子: l = [1,2,3,4,5] d ...

  6. 【Android 高性能音频】Oboe 函数库简介 ( Oboe 简介 | Oboe 特点 | Oboe 编译工具 | Oboe 相关文档 | Oboe 测试工具 )

    文章目录 一.Oboe 简介 二.Oboe 特点 三.Oboe 编译工具 四.Oboe 文档 五.Oboe 测试 一.Oboe 简介 Oboe 简介 : ① 函数库 : Oboe 是 C++ 函数库 ...

  7. python 类-9. 类 — Python 3.9.0 文档

    9.类¶ 类提供了一种组合数据和功能的方法. 创建一个新类意味着创建一个新的对象 类型,从而允许创建一个该类型的新 实例 . 每个类的实例可以拥有保存自己状态的属性. 一个类的实例也可以有改变自己状态 ...

  8. python模块大全doc_Python pydoc模块详解:查看、生成帮助文档

    前面己经介绍了为函数.类.方法等编写文档(只要在函数.类.方法定义后定义一个字符串即可).前面也介绍了使用 help() 函数和 __doc__ 属性来查看函数.类.方法的文档,但这种方式总是在控制器 ...

  9. python docx 设置表格字体和格式_python-docx修改已存在的Word文档的表格的字体格式方法...

    搞了好几天的表格字体格式,一直想找一种能直接一次性修改表格所有字体格式的方法(函数),但是无论用什么方法都无法修改表格字体的格式,原因应该是已存在的文档本身就具有某种格式限制,制约着里面表格里面字体格 ...

最新文章

  1. python中的List 和 Tuple
  2. tf.keras.preprocessing.image_dataset_from_directory() 简介
  3. linux5.8不能上网,Ubuntu 8.04不能上网的问题的解决方法
  4. 23种设计模式C++源码与UML实现--访问者模式
  5. php yii model,Yii模型
  6. Shiro表结构设计
  7. 机房内综合布线电缆的紧密捆绑有哪些问题?
  8. Matplotlib学习---用matplotlib画误差线(errorbar)
  9. java中DatagramSocket连续发送多个数据报包时产生丢包现象解决方案
  10. 机器学习是如何改善企业生产力的?(内附机器智能版图)
  11. python入门教程傻瓜版_毫无基础的人如何入门 Python ?Python入门教程拿走不谢啦!...
  12. php 引入echarts路径,angular4中引入echarts的方法(代码示例)
  13. 《android深入探索》第四章心得
  14. bug[应该已经修复了]:红色方框随机丢失(简书安卓2.0beta)
  15. Knockout.Js官网学习(event绑定、submit绑定)
  16. Mobile First! Wijmo 5 之 架构
  17. 精品软件 推荐 常用软件 游戏的 运行库 下载 合集 3D game 玩游戏的一定要收藏一下。...
  18. 【Latex】PPT画图,导出emf格式,word插入emf文件并导出pdf,pdf裁剪并导出eps文件,latex插入eps文件
  19. js 实现选择文件存放路径
  20. 惠斯通电桥平衡条件推导

热门文章

  1. Android 打开蓝牙流程
  2. Android Binder机制的Native应用
  3. Android关机流程解析
  4. shell 学习之for语句
  5. 数学与泛型编程:高效编程的奥秘pdf_Java 泛型与类型擦除
  6. python dlib gpu ubuntu conda_Ubuntu 下编译支持 GPU 的 TensorFlow 和 Dlib
  7. python判断_Python中判断一个字符串是否以特定字符前缀开始的函数:startswith()
  8. ❤️一分钟学会Python网络编程❤️
  9. MySQL安装和修改密码
  10. 量子计算机代表人物,量子力学究竟“可怕”在哪?科学家的怀疑或许是对的