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

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

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

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

saySomething("Hello")

Как a .py-файл я хочу, чтобы он вызывал функцию greet и передавал "Hello" в качестве аргумента.

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

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

3 ответов


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

конечно, есть множество библиотек и генераторов, которые позволяют обернуть API C / C++ для Python (например,импульс.Питон или глоток), но ваш случай звучит достаточно просто, что с целью обучения ИМО лучше ознакомиться с Python C API. Даже если вы используете эти инструменты, вам часто придется спускаться к API Python C или, по крайней мере, понимать его.


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

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

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


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