Интерфейс между Python и Си
TODO статья на Хабре
TODO pybind11
TODO pocketpy
CTypes
Вся информация и примеры есть в документации
Идея: воспользоваться имеющейся разделяемой библиотекой со стандартным Си/Си+ интерфейсом.
- Найти и загрузить библиотеку
- Задать параметры функции
- Вызвать функцию
Задать тип параметров функции (по умолчанию int и все, что кастится из int)
- Работа с указателями, массивам и т. д.
- …
Недостаток: весь контроль памяти надо делать как в Си — самому
ctypes.string_at(0)
- Неудачный кастинг:
- Если вам не повезло
- Если вам повезло™ (например, источник сильно больше приёмника), оно упадёт
Альзо, faulthandler
CFFI
Идея: воспользоваться имеющейся разделяемой библиотекой со стандартным Си/Си+ интерфейсом
Отличие от ctypes — собственный парсер Си
- Модифицированный второй пример по ссылке выше:
1 from cffi import FFI 2 ffi = FFI() 3 ffi.cdef(""" 4 typedef struct { 5 unsigned char r, g, b; 6 } pixel_t; 7 """) 8 W, H = 8, 4 9 image = ffi.new(f"pixel_t[{H}][{W}]") 10 for y in range(H): 11 for x in range(W): 12 image[y][x].r = x 13 image[y][x].g = y 14 image[y][x].b = y*W+x 15 print(*bytes(ffi.buffer(image)))
Проблема та же, что и в ctypes — ручная проверка памяти и типов, но часть работы делает pycparser сам
Идея: написать функцию на Си и преобразовать её в модуль для Python.
- Потребуется off-Python сборочное окружение (например, компилятор Си)
Пример с компиляцией функции в модуль
(Этот же пример в репозитории с примерами:i
$ python3 ffi_compile.py pi_approx` $ python3 -c 'import _pi_approx; print(_pi_approx.lib.pi_approx(10000000))'
Альзо, внезапно: компиляторы различных языков в составе Python-пакета ZigLang
Python API
Extending Python with C or C++
Идея: программироваать на Си, используя типы данных Python
- Недостаток: скорее всего, придётся запустить интерпретатор Python
Идея: полностью написать модуль на Си.
Большой пример — интерфейс к passwdqc
Cython
Идея: писать всё на специальном ЯП, смеси Python и Си
- Вариант: писать на Python, используя типы Cython (часть проверки и преобразований придётся делать самому)
- Потребуется off-Python сборочное окружение
Впрочем, setuptools умеет в Cython (пока экспериментально)
Пример из документации в виде модуля
Д/З
TODO