Интегрируйте Python и C++

В зависимости от того, хотите ли Вы изменить все идентичные ссылки на что-то еще, или Вы хотите управление просто те в данном разделе страницы или каждого индивидуально, Вы могли сделать один из них.

Изменение все ссылки на Google, таким образом, они указывают на Google Maps:

<a href="http://www.google.com">

$("a[href='http://www.google.com/']").attr('href', 
'http://maps.google.com/');

Для изменения ссылок в данном разделе добавьте класс контейнерного отделения к селектору. Этот пример изменит ссылку Google в содержании, но не в нижнем колонтитуле:

<div class="content">
    <p>...link to <a href="http://www.google.com/">Google</a>
    in the content...</p>
</div>

<div class="footer">
    Links: <a href="http://www.google.com/">Google</a>
</div>

$(".content a[href='http://www.google.com/']").attr('href', 
'http://maps.google.com/');

Для изменения отдельных ссылок независимо от того, где они падают в документе добавьте идентификатор к ссылке и затем добавьте что идентификатор к селектору. Этот пример изменит вторую ссылку Google в содержании, но не первую или ту в нижнем колонтитуле:

<div class="content">
    <p>...link to <a href="http://www.google.com/">Google</a>
    in the content...</p>
    <p>...second link to <a href="http://www.google.com/" 
        id="changeme">Google</a>
    in the content...</p>
</div>

<div class="footer">
    Links: <a href="http://www.google.com/">Google</a>
</div>

$("a#changeme").attr('href', 
'http://maps.google.com/');
58
задан John Isaiah Carmona 21 May 2015 в 06:53
поделиться

8 ответов

Взаимодействие Python с C / C ++ - непростая задача.

Здесь я копирую / вставляю предыдущий ответ на предыдущий вопрос, чтобы различные методы написания расширение python. Включая Boost.Python, SWIG, Pybindgen ...

  • Вы можете написать расширение самостоятельно на C или C ++ с помощью Python C-API .

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

  • Swig :

    pro: вы можете создавать привязки для многих языков сценариев.

    минусы: мне не нравится, как работает парсер. Не знаю, добились ли они какого-то прогресса, но два года назад синтаксический анализатор C ++ был весьма ограничен. В большинстве случаев мне приходилось копировать / вставлять мои заголовки .h, чтобы добавить несколько символов % и дать дополнительные подсказки парсеру swig.

    Мне также нужно было иметь дело с Python C-API из время от времени для (не очень) сложных преобразований типов.

    Больше не использую.

  • Boost.Python :

    pro: Это очень полная библиотека. Он позволяет делать почти все, что возможно с C-API, но на C ++. Мне никогда не приходилось писать код C-API с этой библиотекой. Я тоже ни разу не сталкивался с ошибкой из-за библиотеки. Код для привязок либо работает как шарм, либо отказывается компилироваться.

    Это, вероятно, одно из лучших решений, доступных в настоящее время, если у вас уже есть библиотека C ++ для привязки. Но если вам нужно переписать только небольшую функцию C, я бы, вероятно, попробовал с Cython.

    Минусы: если у вас нет предварительно скомпилированной библиотеки Boost.Python, вы собираетесь использовать Bjam (своего рода замена make ). Я действительно ненавижу Bjam и его синтаксис.

    Библиотеки Python, созданные с помощью BP, имеют тенденцию становиться толстыми. На их компиляцию также уходит много времени.

  • Py ++ : Boost.Python стал проще. Py ++ использует синтаксический анализатор C ++ для чтения вашего кода, а затем автоматически генерирует код Boost.Python. Вы также получаете большую поддержку со стороны его автора (нет, это не я ;-)).

    минусы: только проблемы из-за самого Boost.Python.

    Edit этот проект выглядит прекращенным. Хотя, вероятно, все еще работает, лучше подумать о переключении.

  • Pybindgen :

    Он генерирует код, имеющий отношение к C-API. Вы можете описывать функции и классы в файле Python или позволить Pybindgen читать ваши заголовки и автоматически генерировать привязки (для этого он использует pygccxml, библиотеку python, написанную автором Py ++).

    минусы: это молодой проект, с меньшей командой, чем Boost.Python. По-прежнему существуют некоторые ограничения: вы не можете предоставлять свои собственные исключения C ++, вы не можете использовать множественное наследование для своих классов C ++.

    В любом случае, стоит попробовать!

  • Pyrex и Cython :

    Здесь вы пишете не настоящий C / C ++, а смесь Python и C. Этот промежуточный код будет генерировать обычный Python модуль.

Редактировать 22 июля 2013 г .: Сейчас Py ++ больше не поддерживается, я ищу хорошую альтернативу. В настоящее время я экспериментирую с Cython для своей библиотеки C ++. Этот язык представляет собой смесь Python и C. В функции Cython вы можете использовать сущности Python или C / C ++ (функции, переменные, объекты, ...).

Cython довольно прост в освоении, у него очень хорошая производительность, и вы даже можете полностью отказаться от C / C ++, если вам не нужно взаимодействовать с устаревшими библиотеками C ++.

Однако для C ++ он сопряжен с некоторыми проблемами. Он менее «автоматичен», чем Py ++, поэтому он Возможно, лучше для стабильного C ++ API (что сейчас относится к моей библиотеке). Самая большая проблема, которую я вижу с Cython, связана с полиморфизмом C ++. С помощью Py ++ / boost: python я смог определить виртуальный метод на C ++, переопределить его в Python и вызвать версию Python в C ++. С Cython это все еще выполнимо, но вам нужно явно использовать C-Python API.

Изменить 2017-10-06:

Есть новый, pybind11 , похожий на Boost.Python, но с некоторыми потенциальными преимуществами. Например, он использует возможности языка C ++ 11, чтобы упростить создание новых привязок. Кроме того, это библиотека только для заголовков, поэтому перед ее использованием нечего компилировать и нет библиотеки для компоновки.

Я немного поигрался с ним, и он действительно оказался довольно простым и приятным в использовании. Единственное, чего я боюсь, это что-то вроде Boot. Python это может привести к длительному времени компиляции и большим библиотекам. Я еще не проводил никаких тестов.

93
ответ дан 24 November 2019 в 18:50
поделиться

Мы очень успешно используем swig в нашем продукте.

Обычно swig берет ваш код C ++ и создает вокруг него оболочку python.

3
ответ дан 24 November 2019 в 18:50
поделиться

Да, это возможно, поощряется и задокументировано . Я сам это сделал, и это оказалось очень легко.

10
ответ дан 24 November 2019 в 18:50
поделиться

Справочное руководство по API Python / C - API, используемый программистами C и C ++, которые хотят писать модули расширения или встраивать Python.

Расширение и встраивание интерпретатора Python

описывает, как писать модули на C или C ++ для расширения интерпретатора Python новыми модулями. Эти модули могут определять новые функции, а также новые типы объектов и их методы. В документе также описывается, как встроить интерпретатор Python в другое приложение для использования в качестве языка расширения. Наконец, показано, как компилировать и связывать модули расширения, чтобы их можно было динамически загружать (во время выполнения) в интерпретатор, если базовая операционная система поддерживает эту функцию.

3
ответ дан 24 November 2019 в 18:50
поделиться

Попробуйте Пирекс . Облегчает написание расширений C ++ для Python.

3
ответ дан 24 November 2019 в 18:50
поделиться

См. Это:

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

«Добавить новые встроенные модули в Python довольно легко, если вы знаете, как программировать на C. Модули расширений могут делать две вещи, которые нельзя сделать непосредственно в Python: они могут реализовывать новые встроенные типы объектов и могут вызывать функции библиотеки C и системные вызовы.

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

http : //www.python.org/doc/2.5.2/ext/intro.html

PS Написано "интегрировать" :)

2
ответ дан 24 November 2019 в 18:50
поделиться

Вы можете написать расширений Python на C ++. В основном сам Python написан на C, и вы можете использовать его для вызова своего кода C. У вас есть полный доступ к вашим объектам Python. Также ознакомьтесь с Boost.Python .

1
ответ дан 24 November 2019 в 18:50
поделиться

Раньше я использовал PyCxx http://cxx.sourceforge.net/ и обнаружил, что это очень хорошо.

Он очень элегантно обертывает API Python c и делает его очень простым в использовании. Написать расширение python на C ++ очень просто. Она снабжена наглядными примерами, так что начать работу легко.

Мне очень понравилось пользоваться этой библиотекой, и я рекомендую ее.

2
ответ дан 24 November 2019 в 18:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: