36.6. dl — 在共享对象中调用 C 函数 — Python 文档
来自菜鸟教程
Python/docs/2.7/library/dl
36.6. dl — 在共享对象中调用 C 函数
dl 模块定义了 dlopen()
函数的接口,这是 Unix 平台上用于处理动态链接库的最常见接口。 它允许程序调用此类库中的任意函数。
笔记
除非 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
。 函数的返回值必须是一个 Clong
,它是一个 Python 整数。