Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слева Предыдущая версия | |||
ext:lib [2023/04/10 09:49] root удалено |
— (текущий) | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
- | <div slide> | ||
- | |||
- | ====== Загрузка С библиотек ====== | ||
- | |||
- | Python может загружать библиотеки на С и вызывать функции из них. Для этого можно воспользоваться модулем стандартной библиотеки '' | ||
- | |||
- | Модуль '' | ||
- | |||
- | ===== Загрузка библиотеки в ctypes ===== | ||
- | |||
- | <sxh python> | ||
- | import ctypes | ||
- | |||
- | # В *nix разделяемые библиотеки - файлы .so | ||
- | lib = ctypes.CDLL(' | ||
- | |||
- | # В Windows - файлы .dll | ||
- | lib = ctypes.CDLL(' | ||
- | </ | ||
- | |||
- | </ | ||
- | |||
- | ===== Вызов функции в ctypes ===== | ||
- | |||
- | <sxh python> | ||
- | |||
- | foo = lib.foo | ||
- | foo.restype = ctypes.c_double | ||
- | foo.argtypes = [ctypes.c_int, | ||
- | |||
- | # Теперь функцию foo можно вызывать, | ||
- | |||
- | ret = foo(5, 3.2) | ||
- | print(ret) | ||
- | </ | ||
- | |||
- | </ | ||
- | |||
- | ==== Некоторые популярные типы ctypes ==== | ||
- | |||
- | ^ Тип ctypes ^ Тип C ^ Тип Python ^ | ||
- | | '' | ||
- | | '' | ||
- | | '' | ||
- | | '' | ||
- | | '' | ||
- | | '' | ||
- | |||
- | Так как строки в Python являются константами, | ||
- | |||
- | </ | ||
- | |||
- | ===== Загрузка библиотеки и вызов функции в cffi ===== | ||
- | |||
- | <sxh python> | ||
- | import cffi | ||
- | |||
- | # Создаем объект пространства имен cffi | ||
- | ffi = cffi.FFI() | ||
- | |||
- | # Загружаем заголовочный файл | ||
- | with open(" | ||
- | ffi.cdef(f.read()) | ||
- | |||
- | # Загружаем библиотеку | ||
- | lib = ffi.dlopen(" | ||
- | |||
- | # Вызываем функцию | ||
- | result = lib.foo(5, 3.2) | ||
- | |||
- | # Создаем объект - структуру данных объявленную в заголовочном файле | ||
- | my_data_struct = self.ffi.new(" | ||
- | |||
- | my_data_struct.a = 15 # Работаем с полями структуры на Python | ||
- | |||
- | ffi.buffer(my_data_struct) # Получаем bytes представление структуры | ||
- | |||
- | </ | ||
- | |||
- | </ | ||
- | |||
- | ===== Что еще нужно знать о вызове С функций ===== | ||
- | |||
- | * Написание критичных с точки зрения производительности участков кода на C — один из стандартных способов разогнать Python. | ||
- | * Ошибка в С библиотеке не может быть обработана на уровне Python и приведет к аварийному завершению интерпретатора. | ||
- | * Анализатор С '' | ||
- | * Для CPython можно писать модули С — [[http:// | ||
- | |||
- | </ | ||
- | |||
- | |||
- | |||