Расширение Python с помощью модуля C

1

Итак, у меня есть программа C для взаимодействия с устройством i2c. Мне нужно подключиться к этому устройству из python. Мне просто интересно, стоит ли переносить программу в модуль python или если объем усилий, связанных с портированием, не перевесит, просто выполняя программу с использованием подпроцесса. Я знаю, что я уверен, что это разные для каждого приложения, но я хотел бы знать, стоит ли даже потратить время на изучение расширений python C и переносить эту программу.

Обновление: у меня есть полный доступ к источнику как C, так и питона. Но на стороне python уже есть существенная работа, и я бы хотел, чтобы изменения в ней были минимальными, если это имеет значение. И я также хотел бы свести к минимуму изменения, которые должны быть внесены в C. Это выполнимо, но я не писал его, и он включает в себя много, обращаясь к тому, что я бы предпочел не переделывать.

Теги:
python-module
i2c

5 ответов

3
Лучший ответ

Есть много способов, которыми вы можете продолжить: API Python C, который, кажется, тот, который вы рассматриваете, но также SWIG, Cython, ctypes... пока ваш существующий код C можно превратить в библиотеку (с функциями, вызываемыми "снаружи" ), у вас есть множество опций. Лично я бы рекомендовал Cython - он все больше и больше рассматривался как широкий подмножество Python, достаточно расширенный, чтобы обеспечить эффективную компиляцию в машинный код и прямой вызов функций из библиотек C.

  • 0
    +1 для Cython, но я бы сказал, что Cython является надмножеством Python.
  • 0
    У вас есть ссылка на пример реализации Cython с использованием уже существующего кода на C? То, что я нашел, похоже, пишет код на C, чтобы вписаться в python
Показать ещё 4 комментария
2

Одна из первых программ на Python, которую я написал, была script, которая вызывала функции из библиотеки C, которая звучит близко к тому, что вы делаете. Я использовал ctypes, и я был впечатлен тем, насколько это было легко: я мог получить доступ к каждой библиотечной функции из python, написав несколько строк python (вообще нет C)! Раньше я пробовал API Python C, и для этого требовалось гораздо больше шаблонов. Я не пробовал SWIG или Cython.

1

Не используйте API Python C, есть намного более простые альтернативы, особенно cython.

cython - это Python-подобный язык, который компилируется в C-код для библиотеки Python c. В основном это C с синтаксисом и функциями Python (например, nice для циклов, исключений и т.д.). cython - это, безусловно, самый рекомендуемый способ писать C-расширения для python.

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

0

Я бы рекомендовал ctypes с помощью общей библиотеки. Было бы неплохо, однако, не полагаться на сложные типы, такие как структуры в вашем API-интерфейсе API. Использование подхода псевдо-ООП является самым простым для отображения на Python.

например.

foo_t* foo_new(void);
int foo_bar(foo_t*, int);
int foo_baz(foo_t*, int);
void foo_free(foo_t*);

Здесь вы можете использовать родной материал ctypes. Например. c_void_p для вашего дескриптора объекта и c_int. Строки стиля c также поддерживаются с помощью create_string_buffer (или что-то в этом роде).

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню