36.6. dl — 在共享对象中调用 C 函数 — Python 文档

来自菜鸟教程
Python/docs/2.7/library/dl
跳转至:导航、​搜索

36.6. dl — 在共享对象中调用 C 函数

自 2.6 版起已弃用:dl 模块已在 Python 3 中删除。 请改用 ctypes 模块。


dl 模块定义了 dlopen() 函数的接口,这是 Unix 平台上用于处理动态链接库的最常见接口。 它允许程序调用此类库中的任意函数。

警告

dl 模块绕过 Python 类型系统和错误处理。 如果使用不当,可能会导致分段错误、崩溃或其他不正确的行为。


笔记

除非 sizeof(int) == sizeof(long) == sizeof(char *),否则此模块将无法工作。否则,导入时将引发 SystemError


dl 模块定义了以下函数:

dl.open(name[, mode=RTLD_LAZY])

打开一个共享对象文件,并返回一个句柄。 模式表示后期绑定 (RTLD_LAZY) 或立即绑定 (RTLD_NOW)。 默认值为 RTLD_LAZY。 请注意,某些系统不支持 [X38X]RTLD_NOW。

返回值为 dlobject

dl 模块定义了以下常量:

dl.RTLD_LAZY
作为 open() 的参数很有用。
dl.RTLD_NOW
作为 open() 的参数很有用。 请注意,在不支持立即绑定的系统上,该常量不会出现在模块中。 为了获得最大的可移植性,请使用 hasattr() 来确定系统是否支持立即绑定。

dl 模块定义了以下异常:

exception dl.error
在动态加载和链接例程中发生错误时引发异常。

例子:

>>> import dl, time
>>> a=dl.open('/lib/libc.so.6')
>>> a.call('time'), time.time()
(929723914, 929723914.498)

这个例子是在 Debian GNU/Linux 系统上尝试过的,这是一个很好的例子,说明使用这个模块通常是一个糟糕的选择。

36.6.1. DL 对象

由上面的 open() 返回的 Dl 对象具有以下方法:

dl.close()
释放除内存之外的所有资源。
dl.sym(name)

以数字形式返回名为 name 的函数的指针,如果它存在于引用的共享对象中,否则返回 None。 这在以下代码中很有用:

>>> if a.sym('time'):
...     a.call('time')
... else:
...     time.time()

(请注意,此函数将返回一个非零数字,因为零是 NULL 指针)

dl.call(name[, arg1[, arg2...]])

在引用的共享对象中调用名为 name 的函数。 参数必须是 Python 整数(将按原样传递)、Python 字符串(将向其传递指针)或 None(将作为 NULL)传递。 请注意,字符串只能作为 const char* 传递给函数,因为 Python 不喜欢它的字符串发生变异。

最多必须有 10 个参数,未给出的参数将被视为 None。 函数的返回值必须是一个 C long,它是一个 Python 整数。