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

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

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

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

saySomething("Hello")

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

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

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

7

Решение

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

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

5

Другие решения

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

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

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

4

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

3
По вопросам рекламы [email protected]