> **Источник:** https://python-all.ru/2.7/library/dl.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 36.6. [`dl`](https://python-all.ru/2.7/library/dl.html#module-dl) – вызов C-функций в разделяемых объектах

Устарело с версии 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) .

Модуль [`dl`](https://python-all.ru/2.7/library/dl.html#module-dl) определяет интерфейс к функции `dlopen()`, которая является наиболее распространённым интерфейсом на платформах Unix для работы с динамически подключаемыми библиотеками. Он позволяет программе вызывать произвольные функции из такой библиотеки.

> **Предупреждение**
>
> Модуль [`dl`](https://python-all.ru/2.7/library/dl.html#module-dl) обходит систему типов Python и обработку ошибок. При неправильном использовании это может привести к ошибкам сегментации, сбоям или другому некорректному поведению.

> **Примечание**
>
> Этот модуль работает только при условии `sizeof(int) == sizeof(long) == sizeof(char *)`. В противном случае при импорте будет возбуждено [`SystemError`](https://python-all.ru/2.7/library/exceptions.html#exceptions.SystemError).

Модуль [`dl`](https://python-all.ru/2.7/library/dl.html#module-dl) определяет следующую функцию:

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

Открывает файл разделяемого объекта и возвращает дескриптор. Режим означает позднее связывание ([`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).

Возвращаемое значение – `dlobject`.

Модуль [`dl`](https://python-all.ru/2.7/library/dl.html#module-dl) определяет следующие константы:

#### `dl.RTLD_LAZY`

Полезно в качестве аргумента для [`open()`](https://python-all.ru/2.7/library/dl.html#dl.open).

#### `dl.RTLD_NOW`

Полезно в качестве аргумента для [`open()`](https://python-all.ru/2.7/library/dl.html#dl.open). Обратите внимание, что в системах, не поддерживающих немедленное связывание, эта константа отсутствует в модуле. Для максимальной переносимости используйте [`hasattr()`](https://python-all.ru/2.7/library/functions.html#hasattr), чтобы определить, поддерживает ли система немедленное связывание.

Модуль [`dl`](https://python-all.ru/2.7/library/dl.html#module-dl) определяет следующее исключение:

#### `exception dl.error`

Исключение, возбуждаемое при возникновении ошибки внутри процедур динамической загрузки и компоновки.

Пример:

```python
>>> 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, возвращаемые функцией [`open()`](https://python-all.ru/2.7/library/dl.html#dl.open) выше, имеют следующие методы:

#### `dl.close()`

Освобождает все ресурсы, кроме памяти.

#### `dl.sym(name)`

Возвращает указатель на функцию с именем *name* в виде числа, если она существует в указанном разделяемом объекте, в противном случае `None`. Это полезно в таком коде:

```python
>>> 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.
