Сообщить об ошибке.

Модуль ctypes в Python, интеграция с языком C

Использование функции, написанных на языке C в коде Python

Модуль ctypes представляет собой совместимые с языком C типы данных и позволяет вызывать функции в библиотеках DLL или совместно используемых библиотеках. Модуль можно использовать для обертывания этих библиотек на чистом Python.

Плюсы и минусы модуля ctypes:

Плюсы:

  • Можно подключать любую уже скомпилированную библиотеку языка C

Минусы:


Основные типы данных модуля ctypes в Python

Модуль ctypes определяет ряд примитивных типов данных, совместимых с языком C. В материале приведено соответствие типов модуля ctypes типам языка C и Python. Разобраны примеры использования примитивов модуля ctypes.

Структуры Structure и Union модуля ctypes в Python

Конкретные типы структур и объединений должны быть созданы путем создания подкласса одного из представленных ниже типов и по крайней мере определения переменной класса [._fields_](#Structure._fields_). Модуль ctypes создаст дескрипторы, которые позволят читать и записывать поля путем прямого доступ

Массивы Array модуля ctypes в Python

Рекомендуемый способ создания конкретных типов массивов - это умножение любого типа данных ctypes на положительное целое число. Элементы массива могут быть прочитаны и присвоены с использованием стандартного доступа по индексам и фрагментам среза.

Указатели Pointer модуля ctypes в Python

Конкретные типы указателей создаются путем вызова функции ctypes.POINTER() с типом, на который они будут указывать. Это делается автоматически с помощью функции ctypes.pointer(). В материале приведены примеры создания и использования указателей.

Функция find_library() модуля ctypes.util в Python, поиск библиотек

Функция find_library() модуля ctypes.util пытается найти библиотеку и вернуть ее путь. Цель функции find_library() - найти библиотеку способом, аналогичным тому, как это делает компилятор или загрузчик времени выполнения. В общем эта функция помогает определить библиотеку для загрузки.

Загрузка C-библиотек модулем ctypes в Python

Существует несколько способов загрузки общих библиотек в процесс Python. Один из способов - создать экземпляр одного из следующих классов: ctypes.CDLL(), ctypes.OleDLL(), ctypes.WinDLL(), ctypes.PyDLL(). Приведены несколько примеров загрузки общих DLL модулей

Поведение внешних C-функций модуля ctypes в Python

Объекты C-функций по умолчанию принимают любое количество аргументов, принимают любые экземпляры данных ctypes в качестве аргументов и возвращают тип результата по умолчанию, указанный загрузчиком библиотеки. Их поведение можно настроить, назначив специальные атрибуты объекта внешней C-функции.

Примеры доступа к внешним C-функциям, модуль ctypes в Python

Функции доступны в качестве атрибутов объектов в DLL. Иногда библиотеки DLL экспортируют функции с именами типа таких: '??2@YAPAXI@Z', следовательно, для получения функции, используем getattr(). В Windows некоторые DLL экспортируют функции по номеру, следовательно обращаемся по порядковому номеру.

Примеры вызова функций языка C, модуль ctypes в Python

Функции загруженных C библиотек можно вызывать как обычные вызываемые объекты Python. При вызове функции stdcall с нарушением соглашения о вызовах cdecl, или наоборот возникает ValueError. Вызов функций с собственными типами данных. Указание необходимых типов аргументов (прототипы функций).

Возвращаемые типы внешних C-функций, модуль ctypes в Python

По умолчанию предполагается, что функции возвращают тип C int. Другие типы возвращаемого значения можно указать, установив атрибут .restype объекта функции.

Прототипы внешних C-функций, модуля ctypes в Python

Внешние C-функции также могут быть созданы путем создания экземпляров прототипов функций. Прототипы функций похожи на прототипы функций в языке C. Они описывают функцию (тип возвращаемого значения, типы аргументов, соглашение о вызовах) без определения реализации.

Примеры преобразований типов модуля ctypes в Python

Обычно модуль ctypes выполняет строгую проверку типов. Это означает, что если есть POINTER(c_int) в списке типов аргументов функции или в качестве типа поля члена в определении структуры, то принимаются только экземпляры одного и того же типа. Есть некоторые исключения из этого правила, когда ctype

Неполные типы модуля ctypes в Python

Неполные типы - это структуры, объединения или массивы, члены которых еще не указаны. В языке C они определяются форвардными объявлениями - которые определены позже. В ctypes можно определить класс ячейки cell и установить атрибут _fields_ позже, после объявления пустого класса.

Функции обратного вызова модуля ctypes в Python

Модуль ctypes позволяет создавать указатели вызываемых C-функций из вызываемых объектов Python. Иногда их называют функциями обратного вызова. Представленный здесь пример, использует функцию qsort() стандартной библиотеки C, используемая для сортировки элементов с помощью функции обратного вызова.

Доступ к переменным C-библиотек из модуля ctypes в Python

Некоторые *shared* C-библиотеки не только экспортируют функции, но и экспортируют переменные. Модуль ctypes может получить доступ к таким значениям с помощью методов класса типа .in_dll(), например ctypes.c_int.in_dll().

Поддержка модулем ctypes данных переменного размера в Python

Модуль ctypes обеспечивает некоторую поддержку массивов и структур переменного размера. Для изменения размера буфера памяти существующего объекта ctypes можно использовать функцию ctypes.resize(). Функция принимает объект и запрашивает размер в байтах.

Сюрпризы модуля ctypes в Python

В модуле ctypes есть "*красные линии*", где можно ожидать все что угодно, только не то, что должно происходить на самом деле.

Служебные функции модуля ctypes в Python

В разделе приведены и разобраны все служебные функции модуля ctypes. По некоторым, часто используемым функциям представлены примеры с комментариями.