在线文档教程

dl

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。请注意,有些系统不支持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系统上被尝试过,并且是使用这个模块通常是一个糟糕的选择的事实的一个很好的例子。

1. Dl对象

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

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整数。