Обертывание C кода на python на лету с CFFI / Cython - PullRequest
0 голосов
/ 27 мая 2020

Я работаю над проектом, который требует от меня создания некоторых оболочек в Python для библиотеки C, которую мне нужно вызвать из Python. Для контекста, библиотека C, которую я использую, представляет собой набор файлов заголовков (.h) и статически связанных файлов библиотеки (.a)

Я решил использовать CFFI или Cython, чтобы выполнить свою работу. . Я следил за подобными примерами для CFFI - Взаимодействие кода C с CFFI , а это для Cython - Создание библиотеки C, вызываемой из Python, путем обертывания ее с помощью Cython . Теперь небольшие примеры программ, которые я пробовал в обоих этих модулях, более или менее имеют следующие шаги:

  • Создание интерфейсного кода для вызова C API
    • В CFFI это python файл, объявляющий C необходимые функции и заголовки
    • В Cython это файл .pyx и модификации setup.py
  • Создайте интерфейсный код для сгенерированного файлы .so для связующего кода сопряжения.
  • Вызов обернутых функций из другого сценария python путем импорта библиотеки сопряжения из файла .so.

Теперь это отлично работает для меня. Но мне придется выполнить go через два этапа выполнения в процессе (создание файла .so, а затем фактическое выполнение сценария python с вызываемым C API).

Мне нужно знать, есть ли способ сделать все вышеперечисленное за один шаг выполнения. Например, я хочу запустить свой последний python скрипт, и он должен построить интерфейсный код и импортировать его на лету за одно выполнение .

Для большего контекста я пробовал SWIG, но не смог найти способ обернуть с ним статически связанные библиотеки .a. То же самое и для ctypes.

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Для CFFI вам просто нужно выполнить во время выполнения код, который сейчас находится в сценарии построителя. Переместите все это в функцию, и тогда у вас будет функция, которую вы можете вызвать при необходимости.

0 голосов
/ 27 мая 2020

А нельзя этого сделать?

import os
os.system('command to build your .so here') 
...
import what_ever_you_need
...
...