Оборачивание библиотеки C в Python: C, Cython или ctypes? - PullRequest
260 голосов
/ 21 декабря 2009

Я хочу вызвать библиотеку C из приложения Python. Я не хочу оборачивать весь API, только функции и типы данных, которые относятся к моему случаю. На мой взгляд, у меня есть три варианта:

  1. Создайте действительный модуль расширения на C. Возможно, это излишне, и я также хотел бы избежать накладных расходов при обучении написанию расширений.
  2. Используйте Cython , чтобы открыть соответствующие части из библиотеки C для Python.
  3. Сделайте все это в Python, используя ctypes для связи с внешней библиотекой.

Я не уверен, что 2) или 3) - лучший выбор. Преимущество 3) состоит в том, что ctypes является частью стандартной библиотеки, и полученный код будет представлять собой чистый Python & ndash; хотя я не уверен, насколько велико это преимущество на самом деле.

Есть ли еще преимущества / недостатки при любом выборе? Какой подход вы рекомендуете?


Редактировать: Спасибо за все ваши ответы, они предоставляют хороший ресурс для тех, кто хочет сделать что-то подобное. Решение, конечно же, еще предстоит принять для отдельного случая - нет единственного ответа «Это правильная вещь». Для моего собственного случая я, вероятно, пойду с ctypes, но я также с нетерпением жду возможности попробовать Cython в каком-то другом проекте.

Поскольку единого истинного ответа не существует, принять его несколько произвольно; Я выбрал ответ FogleBird, так как он дает хорошее представление о ctypes, и в настоящее время он также является самым популярным. Тем не менее, я предлагаю прочитать все ответы, чтобы получить хороший обзор.

Еще раз спасибо.

Ответы [ 11 ]

2 голосов
/ 01 сентября 2011

Существует также одна возможность использовать GObject Introspection для библиотек, использующих GLib .

...