Содержание страницы
36.6. dl – вызов C-функций в разделяемых объектах¶dl – Call C functions in shared objects
Модуль 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_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¶Dl Objects
Объекты Dl, возвращаемые функцией open() выше, имеют следующие методы:
-
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.