История изменений
Исправление shaplov, (текущая версия) :
Как правильно сказал O02eg это делается через
PyImport_AppendInittab
Я сам параллельно таки нашел это вот в этом примере: https://github.com/TNG/boost-python-examples/tree/main/10-Embedding (прикольный набор примеров к стати)
Суммарно, программа собираемая с обеими питонами выглядит теперь так:
#include <boost/python.hpp>
std::string provide_hello() {
return "hello world provided";
}
BOOST_PYTHON_MODULE(_hello_provider) {
using namespace boost::python;
def("provide_hello", &provide_hello);
}
int main()
{
#if PY_MAJOR_VERSION >= 3
PyImport_AppendInittab((char*)"_hello_provider", PyInit__hello_provider);
#else
PyImport_AppendInittab((char*)"_hello_provider", init_hello_provider);
#endif
Py_InitializeEx(0);
try {
boost::python::object modImp = boost::python::import("imp");
PyImport_AddModule("test_module");
modImp.attr("load_source")("test_module", "test_module.py");
boost::python::exec("print(test_var)", boost::python::import("test_module").attr("__dict__"));
boost::python::exec("print(hello_static())", boost::python::import("test_module").attr("__dict__"));
boost::python::exec("print(hello_provided())", boost::python::import("test_module").attr("__dict__"));
}
catch (const boost::python::error_already_set&)
{
PyErr_Print();
}
Py_Finalize();
}
Исходная версия shaplov, :
Как правильно сказал O02eg это делается через PyImport_AppendInittab
Я сам параллельно таки нашел это вот в этом примере: https://github.com/TNG/boost-python-examples/tree/main/10-Embedding (прикольный набор примеров к стати)
Суммарно, программа собираемая с обеими питонами выглядит теперь так:
#include <boost/python.hpp>
std::string provide_hello() {
return "hello world provided";
}
BOOST_PYTHON_MODULE(_hello_provider) {
using namespace boost::python;
def("provide_hello", &provide_hello);
}
int main()
{
#if PY_MAJOR_VERSION >= 3
PyImport_AppendInittab((char*)"_hello_provider", PyInit__hello_provider);
#else
PyImport_AppendInittab((char*)"_hello_provider", init_hello_provider);
#endif
Py_InitializeEx(0);
try {
boost::python::object modImp = boost::python::import("imp");
PyImport_AddModule("test_module");
modImp.attr("load_source")("test_module", "test_module.py");
boost::python::exec("print(test_var)", boost::python::import("test_module").attr("__dict__"));
boost::python::exec("print(hello_static())", boost::python::import("test_module").attr("__dict__"));
boost::python::exec("print(hello_provided())", boost::python::import("test_module").attr("__dict__"));
}
catch (const boost::python::error_already_set&)
{
PyErr_Print();
}
Py_Finalize();
}