Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
Разработка программного обеспечения

Embedding

Boost , Boost.Python Tutorial , Boost.Python Tutorial

Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

PrevUpHomeNext

Теперь вы должны знать, как использовать Boost. Python вызывает ваш код C++ из Python. Однако иногда вам может потребоваться сделать обратное: вызвать код Python со стороны C++. Это требует, чтобы вывстроилиинтерпретатор Python в свою программу C++.

В настоящее время, Boost. Python не поддерживает все, что вам нужно при встраивании. Для заполнения пробелов необходимо использовать APIPython/C. Тем не менее, буст. Python уже значительно упрощает встраивание, и в будущей версии может стать ненужным касаться API Python / C. Оставайтесь на связи...

Building embedded programs

Чтобы иметь возможность встраивать Python в свои программы, вы должны ссылаться на оба Boost. Python, а также собственная библиотека времени выполнения Python.

Повышаю. Библиотека Python представлена в двух вариантах. Оба расположены в подкаталоге Boost</libs/python/build/bin-stage>. На Windows варианты называются<boost_python.lib>(для сборок релиза) и<boost_python_debug.lib>(для отладки). Если вы не можете найти библиотеки, вы, вероятно, не построили Boost. Python пока. См.Построение и испытаниео том, как это сделать.

Библиотеку Python можно найти в подкаталоге вашего каталога Python</libs>. В Windows это называется pythonXY.lib, где X.Y - ваш основной номер версии Python.

Кроме того, в ваш путь включения должен быть добавлен подкаталог Python</include>.

В Jamfile все вышеперечисленное сводится к:

projectroot c:\projects\embedded_program ; # location of the program
# bring in the rules for python
SEARCH on python.jam = $(BOOST_BUILD_PATH) ;
include python.jam ;
exe embedded_program # name of the executable
  : #sources
     embedded_program.cpp
  : # requirements
     <find-library>boost_python <library-path>c:\boost\libs\python
  $(PYTHON_PROPERTIES)
    <library-path>$(PYTHON_LIB_PATH)
    <find-library>$(PYTHON_EMBEDDED_LIBRARY) ;

Getting started

Умение строить — это хорошо, но пока нечего строить. Встраивание интерпретатора Python в одну из ваших программ на C++ требует следующих 4 шагов:

  1. #включает<<boost/python.hpp>>
  2. ПозвонитеPy_Initialize(), чтобы запустить интерпретатор и создать модуль<__main__>.
  3. Вызовите другие программы Python C API для использования интерпретатора.
[Note] Note

Обратите внимание, что в это время вы не должны звонитьPy_Finalize(), чтобы остановить переводчика. Это может быть исправлено в будущей версии boost.python.

(Конечно, между всеми этими шагами может быть другой код C++.)

Теперь, когда мы можем встроить интерпретатор в наши программы, давайте посмотрим, как его использовать...

Как вы, наверное, уже знаете, объекты в Python учитываются. Естественно, что<PyObject>s API Python C также учитываются. Однако есть разница. В то время как эталонный учет полностью автоматизирован в Python, API Python C требует, чтобы вы делали этовручную. Это сложно и особенно трудно сделать при наличии исключений C++. К счастью, рост. Python предоставляет шаблоны классовhandleиobjectдля автоматизации процесса.

Running Python code

Boost.python предоставляет три связанные функции для запуска кода Python с C++.

object eval(str expression, object globals = object(), object locals = object())
object exec(str code, object globals = object(), object locals = object())
object exec_file(str filename, object globals = object(), object locals = object())

Эвал оценивает данное выражение и возвращает полученное значение. exec выполняет данный код (как правило, набор утверждений), возвращая результат, а exec_file выполняет код, содержащийся в данном файле.

Параметры<globals>и<locals>— это словари Python, содержащие глобалы и локальные значения контекста, в котором запускается код. Для большинства целей вы можете использовать словарь пространства имен модуля<__main__>для обоих параметров.

Boost.python предоставляет функцию импорта модуля:

object import(str name)

импортирует питоновый модуль (потенциально загружает его в запущенный процесс) и возвращает его.

Давайте импортируем модуль<__main__>и запустим код Python в его пространстве имен:

object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
object ignored = exec("hello = file('hello.txt', 'w')\n"
                      "hello.write('Hello world!')\n"
                      "hello.close()",
                      main_namespace);

Это должно создать файл под названием «hello.txt» в текущем каталоге, содержащий фразу, которая хорошо известна в кругах программирования.

Manipulating Python objects

Часто мы хотели бы иметь класс для манипулирования объектами Python. Но мы уже видели такой класс выше, и впредыдущем разделе: Названы<object>класс и его производные. Мы уже видели, что они могут быть построены из<handle>. Следующие примеры должны дополнительно проиллюстрировать этот факт:

object main_module = import("__main__");
object main_namespace = main_module.attr("__dict__");
object ignored = exec("result = 5 ** 2", main_namespace);
int five_squared = extract<int>(main_namespace["result"]);

Здесь мы создаем словарный объект для пространства имен модуля<__main__>. Затем мы присваиваем переменной результата 5 квадратов и читаем эту переменную из словаря. Другой способ добиться того же результата — использовать вместо этого эвал, который возвращает результат напрямую:

object result = eval("5 ** 2");
int five_squared = extract<int>(result);

Exception handling

Если в оценке выражения питона происходит исключение,error_already_setвыбрасывается:

try
{
    object result = eval("5/0");
    // execution will never get here:
    int five_divided_by_zero = extract<int>(result);
}
catch(error_already_set const &)
{
    // handle the exception in some way
}

Класс исключений<error_already_set>не несет в себе никакой информации. Чтобы узнать больше об исключении Python, которое произошло, вам нужно использовать функции обработки исключенийAPI Python C в вашем заявке на улов. Это может быть так же просто, как позвонитьPyErr_Print(), чтобы распечатать обратную связь исключения к консоли, или сравнить тип исключения с теми изстандартных исключений:

catch(error_already_set const &)
{
    if (PyErr_ExceptionMatches(PyExc_ZeroDivisionError))
    {
        // handle ZeroDivisionError specially
    }
    else
    {
        // print all other errors to stderr
        PyErr_Print();
    }
}

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


PrevUpHomeNext

Статья Embedding раздела Boost.Python Tutorial Boost.Python Tutorial может быть полезна для разработчиков на c++ и boost.




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.



:: Главная :: Boost.Python Tutorial ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-30 11:47:00
2025-05-19 18:43:51/0.0078680515289307/0