python_interpreter.cpp
63 lines
| 1.3 KiB
| text/x-c
|
CppLexer
r1428 | #include "python_interpreter.h" | |||
#include <Data/DateTimeRange.h> | ||||
#include <TimeSeries.h> | ||||
#include <functional> | ||||
#include <iostream> | ||||
#include <pybind11/embed.h> | ||||
#include <pybind11/functional.h> | ||||
#include <pybind11/stl.h> | ||||
r1440 | ||||
r1428 | namespace py = pybind11; | |||
PYBIND11_EMBEDDED_MODULE(PythonProviders, m) {} | ||||
static pybind11::gil_scoped_release* _rel = nullptr; | ||||
PythonInterpreter::PythonInterpreter() | ||||
{ | ||||
py::initialize_interpreter(false); | ||||
} | ||||
r1430 | void PythonInterpreter::add_register_callback( | |||
std::function<void(const std::vector<product_t>&, provider_funct_t)> callback) | ||||
r1428 | { | |||
py::module PythonProviders = py::module::import("PythonProviders"); | ||||
PythonProviders.attr("register_product") = callback; | ||||
} | ||||
PythonInterpreter::~PythonInterpreter() | ||||
{ | ||||
if (_rel) | ||||
delete _rel; | ||||
py::finalize_interpreter(); | ||||
} | ||||
void PythonInterpreter::eval(const std::string& file) | ||||
{ | ||||
try | ||||
{ | ||||
py::eval_file(file); | ||||
} | ||||
catch (py::error_already_set const& pythonErr) | ||||
{ | ||||
std::cout << pythonErr.what(); | ||||
} | ||||
r1429 | } | |||
r1440 | void PythonInterpreter::eval_str(const std::string& content) | |||
{ | ||||
try | ||||
{ | ||||
py::eval<py::eval_statements>(content); | ||||
} | ||||
catch (py::error_already_set const& pythonErr) | ||||
{ | ||||
std::cout << pythonErr.what(); | ||||
} | ||||
} | ||||
r1429 | void PythonInterpreter::release() | |||
{ | ||||
r1428 | _rel = new py::gil_scoped_release(); | |||
} | ||||