Различия
Показаны различия между двумя версиями страницы.
— |
binlib [2023/04/10 09:50] (текущий) 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:// | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||