Вызов C / C ++ из Python? - PullRequest
       105

Вызов C / C ++ из Python?

464 голосов
/ 28 сентября 2008

Какой самый быстрый способ создать привязку Python к библиотеке C или C ++?

(я использую Windows, если это имеет значение.)

Ответы [ 14 ]

7 голосов
/ 28 сентября 2008

Один из официальных документов Python содержит подробности о расширении Python с использованием C / C ++ . Даже без использования SWIG , это довольно просто и прекрасно работает в Windows.

5 голосов
/ 29 декабря 2015

Cython - определенно правильный путь, если только вы не планируете писать обертки Java, в этом случае SWIG может быть предпочтительнее

Я рекомендую использовать утилиту командной строки runcython, которая делает процесс использования Cython чрезвычайно простым. Если вам нужно передать структурированные данные в C ++, посмотрите библиотеку Protobuf от Google, это очень удобно.

Вот минимальные примеры, которые я сделал с использованием обоих инструментов:

https://github.com/nicodjimenez/python2cpp

Надеюсь, это может быть полезной отправной точкой.

5 голосов
/ 28 августа 2015

Вопрос в том, как вызвать функцию C из Python, если я правильно понял. Тогда лучшим выбором будет Ctypes (кстати, переносимый во всех вариантах Python).

>>> from ctypes import *
>>> libc = cdll.msvcrt
>>> print libc.time(None)
1438069008
>>> printf = libc.printf
>>> printf("Hello, %s\n", "World!")
Hello, World!
14
>>> printf("%d bottles of beer\n", 42)
42 bottles of beer
19

Подробное руководство вы можете найти в статье моего блога .

5 голосов
/ 24 апреля 2015

Сначала вы должны решить, какова ваша конкретная цель. Официальная документация Python по расширению и внедрению интерпретатора Python была упомянута выше, я могу добавить хороший обзор двоичных расширений . Варианты использования можно разделить на 3 категории:

  • ускорительные модули : работать быстрее, чем эквивалентный чистый код Python, запускаемый в CPython.
  • модули-оболочки : для представления существующих интерфейсов C в коде Python.
  • низкоуровневый доступ к системе : для доступа к низкоуровневым функциям среды выполнения CPython, операционной системы или базового оборудования.

Чтобы дать более широкую перспективу для других заинтересованных лиц, и поскольку ваш первоначальный вопрос немного расплывчатый («к библиотеке C или C ++»), я думаю, эта информация может быть вам интересна. По ссылке выше вы можете прочитать о недостатках использования бинарных расширений и их альтернатив.

Помимо других предложенных ответов, если вы хотите ускорительный модуль, вы можете попробовать Numba . Он работает «путем генерации оптимизированного машинного кода с использованием инфраструктуры компилятора LLVM во время импорта, во время выполнения или статически (с помощью включенного инструмента pycc)».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...