2009-07-02 3 views
5

Может ли кто-нибудь, пожалуйста, дать мне советы по инструментам или программному обеспечению для расширения Python с помощью C/C++? Благодарю.Расширение Python с C/C++

+6

Когда вы читаете http://docs.python.org/c-api/, какие у вас проблемы? –

+0

Cython - хороший вариант для этого! Я на самом деле написал небольшую заметку об этом, покрывая все детали из написания исходных файлов Cython для их создания, записывая setup.py - в общем, все, что вам нужно, чтобы обернуть библиотеку C/C++ с помощью Cython: http://martinsosic.com/ development/2016/02/08/wrapping-c-library-as-python-module.html – Martinsos

ответ

8

Мы используем SWIG для упаковки наших библиотек C/C++ для использования в Python. Это работает очень хорошо.

http://www.swig.org/

13

сайт Питон сам имеет большой set of examples, а также API documentation. Это буквально все, что я использовал, когда мне нужно было писать расширения C.

+0

+1: Это уже хорошо документировано. –

+0

О, я думал, что вы имели в виду образно, спасибо за разъяснение – andrewrk

+0

Письменный код является лучшим, если библиотека не необычайно большая (например, QT или WxWidgets). – Lothar

2

Да, вам это нужно: http://www.python.org/doc/ext/

И, конечно, также C/C++ компилятор.

Если вы опишете, что вы пытаетесь сделать, и какие расширения вы делаете, я уверен, что люди могут дать вам больше информации.

Есть такие вещи, как SWIG для обертывания библиотек, если это то, что вы хотите сделать. Если вы просто хотите ускорения, C часто является ответом, но не всегда и т. Д.

13

Я добавлю обязательную ссылку на Boost.Python на C++.

+0

Я начал использовать boost.python несколько дней назад, и я уже работаю. –

3

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

Cython - это языки, которые «выглядят как python», но могут быть сделаны намного быстрее, используя необязательный ввод. Вы можете напрямую вызвать функции C внутри, и большая часть подсчета ссылок (сложная проблема в C-расширениях) выполняется автоматически. По моему опыту, это намного лучше, чем boost.python, swig или ctypes:

  • boost.python имеет смысл только для обертывания расширений C++ IMHO. Я считаю это слишком сложным и трудно отлаживать, когда что-то идет не так.
  • swig имеет довольно накладные расходы и не приводит к хорошему коду. Он хорошо работает в течение нескольких функций, но не тривиальные расширения часто используют typemaps и синтаксис становится уродливым быстро

С Cython, вы можете использовать питон объекты (список, Словарь, и т.д ...), чтобы обернуть C библиотеки. Конечно, это также очень полезно, если вам нужно написать собственное расширение только по соображениям скорости. В научном сообществе python я думаю, что cython стал инструментом выбора, когда нужна скорость.

+0

Говоря «вы должны избегать этого, если это возможно», не зная причин, по которым OP хочет это сделать, в первую очередь ошибочно. Существует причина, по которой Python поддерживает расширения C, и это потому, что иногда расширение C является лучшим решением, и в этом случае его не следует избегать. Кроме того, ctypes имеет много преимуществ по сравнению с cython в зависимости от контекста, без которого он ошибочно говорит, что один лучше (см. Http://stackoverflow.com/questions/1942298/wrapping-ac-library-in-python-c-cython- or-ctypes) – mwag

6

Я вижу, что никто пока не указал одно из моих любимых решений для упаковки кода на C++, SIP (Я считаю, что он также работает для упаковки C, как SWIG и в отличие от Boost, но я никогда не использовал его таким образом). Это инструмент Riverbank Software, разработанный для того, чтобы сделать PyQt, интерфейс Python отличной кросс-платформенной платформой Qt C++, поэтому это естественный выбор, если ваш код на C++ использует любую функциональность Qt, так же как Boost Python - естественный выбор, если ваш код на C++ использует Boost.

SWIG - это то, что мы используем на работе (разумное решение, когда оно было сделано 10 лет назад ;-), и имеет теоретическое преимущество в том, что он может также обернуть код C или C++ для использования с Java, Perl, Tcl и т. Д. - но если вы только заботитесь о Python, трудно увидеть что-нибудь, чтобы выделиться.

Если вы просто обертываете существующую DLL/так, помимо Cython, на что указывают другие ответы (и я поддерживаю, но ... в наши дни это очень быстро меняется, поэтому будьте осторожны, если вам нужно что-то более стабильное) , рассмотрим стандартный функциональный модуль ctypes - я бы не использовал его для очень обширной работы (ошибки «oops», которые компилятор C или C++ укажет на вас, может вызвать сбои во время выполнения с помощью ctypes), но для небольших заданий это замечательно (и очень удобно, поскольку он поставляется со стандартными дистрибутивами Python! -).

Хороший старый API C еще не мертв - сегодня встретился с Кейсом, великим парнем, который в последнее время занимается большей частью моего старого старого проекта с открытым исходным кодом gmpy, и вместе мы решили придерживаться C API для, по крайней мере, следующей версии gmpy - мы рассмотрим возможность переключения на Cython, когда он стабилизируется, но мы согласились, что коммутатор все еще будет немного преждевременным. (Мы даже не думали о какой-либо другой альтернативе, потому что главное условие gmpy должно быть столь же ослепительно быстрым, как мы можем это сделать!).

+0

Что вы думаете о Siboken, эквивалентном PySide? http://www.pyside.org/docs/shiboken/ –

+0

@Craig, еще не пробовал, я планирую, когда мне нужно будет сделать некоторую работу Qt (так что дайте мне реальный шанс попробовать PySide). –

+0

Прошу прощения за опечатку, я имел в виду «Шибокен». PySide звучит многообещающе; Мне просто жаль, что им нужно изобретать велосипед. –

3

В прошлом я использовал pycxx, и мне действительно понравилось использовать эту библиотеку.

На мой взгляд, это проще в использовании, чем SWIG. Я не могу сравниться с boost.python, потому что я никогда не использовал boost. Я думаю, что pycxx легче, чем boost.python, но я могу ошибаться.

Ключевым моментом для pycxx является то, что это C++-оболочка python c api. Он объектно-ориентирован и скрывает весь сложный механизм. Это довольно интуитивно понятно для программиста на питоне. Он очень прост в использовании, и есть несколько хороших примеров для начала работы.

Я рекомендую pycxx как первоклассный гражданин для создания расширения python в C++.

Смежные вопросы