dl.md
1> **Источник:** https://python-all.ru/2.7/library/dl.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 36.6. [`dl`](https://python-all.ru/2.7/library/dl.html#module-dl) – вызов C-функций в разделяемых объектах89Устарело с версии 2.6: Модуль [`dl`](https://python-all.ru/2.7/library/dl.html#module-dl) удалён в Python 3. Вместо него используйте модуль [`ctypes`](https://python-all.ru/2.7/library/ctypes.html#module-ctypes) .1011Модуль [`dl`](https://python-all.ru/2.7/library/dl.html#module-dl) определяет интерфейс к функции `dlopen()`, которая является наиболее распространённым интерфейсом на платформах Unix для работы с динамически подключаемыми библиотеками. Он позволяет программе вызывать произвольные функции из такой библиотеки.1213> **Предупреждение**14>15> Модуль [`dl`](https://python-all.ru/2.7/library/dl.html#module-dl) обходит систему типов Python и обработку ошибок. При неправильном использовании это может привести к ошибкам сегментации, сбоям или другому некорректному поведению.1617> **Примечание**18>19> Этот модуль работает только при условии `sizeof(int) == sizeof(long) == sizeof(char *)`. В противном случае при импорте будет возбуждено [`SystemError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.SystemError).2021Модуль [`dl`](https://python-all.ru/2.7/library/dl.html#module-dl) определяет следующую функцию:2223#### `dl.open(name[, mode=RTLD_LAZY])`2425Открывает файл разделяемого объекта и возвращает дескриптор. Режим означает позднее связывание ([`RTLD_LAZY`](https://python-all.ru/2.7/library/dl.html#dl.RTLD_LAZY)) или немедленное связывание ([`RTLD_NOW`](https://python-all.ru/2.7/library/dl.html#dl.RTLD_NOW)). По умолчанию используется [`RTLD_LAZY`](https://python-all.ru/2.7/library/dl.html#dl.RTLD_LAZY). Обратите внимание, что некоторые системы не поддерживают [`RTLD_NOW`](https://python-all.ru/2.7/library/dl.html#dl.RTLD_NOW).2627Возвращаемое значение – `dlobject`.2829Модуль [`dl`](https://python-all.ru/2.7/library/dl.html#module-dl) определяет следующие константы:3031#### `dl.RTLD_LAZY`3233Полезно в качестве аргумента для [`open()`](https://python-all.ru/2.7/library/dl.html#dl.open).3435#### `dl.RTLD_NOW`3637Полезно в качестве аргумента для [`open()`](https://python-all.ru/2.7/library/dl.html#dl.open). Обратите внимание, что в системах, не поддерживающих немедленное связывание, эта константа отсутствует в модуле. Для максимальной переносимости используйте [`hasattr()`](https://python-all.ru/2.7/library/functions.html#hasattr), чтобы определить, поддерживает ли система немедленное связывание.3839Модуль [`dl`](https://python-all.ru/2.7/library/dl.html#module-dl) определяет следующее исключение:4041#### `exception dl.error`4243Исключение, возбуждаемое при возникновении ошибки внутри процедур динамической загрузки и компоновки.4445Пример:4647```python48>>> import dl, time49>>> a=dl.open('/lib/libc.so.6')50>>> a.call('time'), time.time()51(929723914, 929723914.498)52```5354Этот пример был опробован в системе Debian GNU/Linux и служит хорошей иллюстрацией того, что использование этого модуля обычно является плохой альтернативой.5556## 36.6.1. Объекты Dl5758Объекты Dl, возвращаемые функцией [`open()`](https://python-all.ru/2.7/library/dl.html#dl.open) выше, имеют следующие методы:5960#### `dl.close()`6162Освобождает все ресурсы, кроме памяти.6364#### `dl.sym(name)`6566Возвращает указатель на функцию с именем *name* в виде числа, если она существует в указанном разделяемом объекте, в противном случае `None`. Это полезно в таком коде:6768```python69>>> if a.sym('time'):70... a.call('time')71... else:72... time.time()73```7475(Обратите внимание, что эта функция возвращает ненулевое число, так как ноль – это указатель *NULL* )7677#### `dl.call(name[, arg1[, arg2...]])`7879Вызывает функцию с именем *name* в указанном разделяемом объекте. Аргументы должны быть либо целыми числами Python (передаются как есть), либо строками Python (передаётся указатель на них), либо `None` (передаётся как *NULL*). Обратите внимание, что строки следует передавать только в функции, ожидающие `const char*`, так как Python не допускает изменения своих строк.8081Аргументов должно быть не более 10, а отсутствующие аргументы будут рассматриваться как `None`. Возвращаемое значение функции должно быть C-типом `long`, который является целым числом Python.82