![]() |
![]() ![]() ![]() ![]() ![]() |
![]() |
EmbeddingBoost , Boost.Python Tutorial , Boost.Python Tutorial
|
![]() |
Note |
---|---|
Обратите внимание, что в это время вы не должны звонитьPy_Finalize(), чтобы остановить переводчика. Это может быть исправлено в будущей версии boost.python. |
(Конечно, между всеми этими шагами может быть другой код C++.)
Теперь, когда мы можем встроить интерпретатор в наши программы, давайте посмотрим, как его использовать...
Как вы, наверное, уже знаете, объекты в Python учитываются. Естественно, что<PyObject
>s API Python C также учитываются. Однако есть разница. В то время как эталонный учет полностью автоматизирован в Python, API Python C требует, чтобы вы делали этовручную. Это сложно и особенно трудно сделать при наличии исключений C++. К счастью, рост. Python предоставляет шаблоны классовhandleиobjectдля автоматизации процесса.
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» в текущем каталоге, содержащий фразу, которая хорошо известна в кругах программирования.
Часто мы хотели бы иметь класс для манипулирования объектами 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);
Если в оценке выражения питона происходит исключение,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(); } }
(Для получения еще большей информации из исключения вы можете использовать некоторые другие функции обработки исключений, перечисленные здесь.)
Статья Embedding раздела Boost.Python Tutorial Boost.Python Tutorial может быть полезна для разработчиков на c++ и boost.
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.
:: Главная :: Boost.Python Tutorial ::
реклама |