Расширение Python с помощью модуля C - PullRequest
1 голос
/ 19 августа 2010

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

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

Ответы [ 5 ]

3 голосов
/ 19 августа 2010

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

2 голосов
/ 19 августа 2010

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

1 голос
/ 19 августа 2010

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

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

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

0 голосов
/ 19 августа 2010

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

* 1003 Е.Г. *

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 голосов
/ 19 августа 2010

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

...