Вызов функций C++ через скрипт Python

У меня есть сценарий, в котором у меня есть некоторые функции в классах C++, и я хочу иметь возможность вызывать их с помощью скрипта Python. Допустим, у меня есть функция

void greet(_msg);
    std::cout >> _msg >> std::endl;

Я хочу иметь возможность вызывать его через собственный вызов Python и передавать ему аргументы, например, используя

saySomething("Hello")

В качестве файла .py я хочу, чтобы он вызывал функцию приветствия и передал «Привет» в качестве аргумента.

Я знаю, что эта тема широко обсуждалась, и я провел небольшое исследование по встраиванию python в C++, мне удалось прочитать значения из скрипта python, используя стандартный API Python/C, и запустить функцию в Python. из С++ и передать ему аргумент, но я не могу понять, как добиться этого конкретного результата.

Я просмотрел ctypes и различные библиотеки-оболочки, такие как boost: python или swig, но я не могу понять, в какой степени они могут помочь мне достичь желаемого.


person leoncvlt    schedule 21.11.2012    source источник
comment
запустить функцию в Python из С++, что вы имеете в виду? Если вам нравится маскировать C/C++ как API Python, вы можете применить основные правила привязки Python для C/C++, также есть библиотека boost::python, с которой проще работать при написании API Python, начиная с кода C++.   -  person user1797612    schedule 21.11.2012
comment
Извините, это было неясно. Я хочу иметь скрипт Python, который вызывает определенную функцию класса C ++ и может передавать ему аргументы. Более или менее похоже на графический интерфейс, но делается с помощью скриптов Python вместо кнопок.   -  person leoncvlt    schedule 21.11.2012
comment
поэтому вы ищете этот docs.python.org/3.2/extending/extending.html или boost::python (вероятно, проще), а также ответы на этот вопрос могут стать хорошей отправной точкой stackoverflow.com/questions/276761/exposed-ac-api-to-python . В любом случае, вы хотите сгенерировать Python API для кода C++, вот и все, просто следуйте официальному руководству или используйте эти библиотеки.   -  person user1797612    schedule 21.11.2012


Ответы (3)


В зависимости от того, какая версия Python вас интересует, 2.x или 3.x, прочтите главу Расширение и встраивание интерпретатора Python для 2.x или 3 .х. Вас интересует только расширение Python, поэтому раздел 1. Расширение Python с помощью C или C++ предоставит вам полное объяснение того, как реализовать то, что вам нужно, чтобы иметь возможность вызывать ваши функции, реализованные на C++, из скрипта Python.

Конечно, существует множество библиотек и генераторов, позволяющих обертывать API-интерфейсы C/C++ для Python (например, Boost. Python или SWIG), но ваш случай звучит достаточно просто, так что для целей изучения это IMO лучше ознакомиться с Python C API. Даже если вы используете эти инструменты, вам все равно часто придется переходить к Python C API или, по крайней мере, понимать его.

person mloskot    schedule 21.11.2012

Недавно мне нужно было сделать именно это. Boost.Python делает то, что мы ищем (и даже больше), но лично (как бы я ни любил Boost) я считаю немного излишним перетаскивать половину библиотеки Boost, чтобы получить одну функцию. SWIG также не был для меня вариантом, поскольку генерация кода всегда становится проблемой для поддержки при изменении структуры классов (не поймите меня неправильно, это БЛЕСТЯЩИЕ решения!, просто не то, что я искал).

Так что мне оставалось только реализовать его из первых принципов (Python/C API). Таким образом, "ECS:Python" родился. ECS:Python (Embedded C++ Scripting with Python) — это простая библиотека-оболочка C++ Python, которую я разработал специально для разработчиков C++. Он позволяет предоставлять объекты из приложения C++ встроенному интерпретатору Python для интерактивного написания сценариев, он очень легкий и простой в использовании.

Это бесплатно (BSD) и с открытым исходным кодом. Если вам интересно, вот он: http://sourceforge.net/projects/ecspython

person Marcus Tomlinson    schedule 27.11.2012

Вы можете использовать функцию weave.inline(), которая является частью пакета scipy, для компиляции и выполнения файлов C/C++ и получения их вывода из вашего скрипта Python.

person SidR    schedule 21.11.2012