Есть некий проект, использующиий libboost-python, который в си++-рантайме создает питоновский модуль, и потом запускает питоновский скрипт который этот модуль импортирует и использует. Сделано это было на питоне 2.7. Случился принудительный переход на питон 3.* и мне так и не удалось заставить это работать в новых условиях.
Может быть кто-то более опытный в ембеденье питона может подсказать как правильно сделать.
Как было (упрощенный вариант):
test_module.py
import _hello_provider
test_var = 42
def hello_static():
        return "Hello world static"
def hello_provided():
        return _hello_provider.provide_hello()
test27.cpp
#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()
{
  Py_InitializeEx(0);
  try {
    boost::python::object modImp = boost::python::import("imp");
    init_hello_provider();
    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();
}
На Debian Stretch собираем так:
g++  test27.cpp  -I /usr/include/x86_64-linux-gnu/python2.7 -I /usr/include/python2.7 -lboost_python -lboost_system -lpython2.7
Все работает последний вывод через питоновский модуль дергает си++ную функцию из добавленного в рантайме модуля _hello_provider.
А вот когда я пытаюсь сделать это по аналогии на современном дебиане:
#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()
{
  Py_InitializeEx(0);
  try {
    boost::python::object modImp = boost::python::import("imp");
    PyInit__hello_provider();
    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();
}
С тем же самым питоновским файлом, собирая все на, Debian Bullseye командой
g++ test3x.cpp  -I /usr/include/x86_64-linux-gnu/python3.9 -I /usr/include/python3.9 -lpython3.9  -lboost_python39 -lboost_system
То все собирается, но при запуске ругается:
Traceback (most recent call last):
  File "/usr/lib/python3.9/imp.py", line 169, in load_source
    module = _exec(spec, sys.modules[name])
  File "<frozen importlib._bootstrap>", line 613, in _exec
  File "<frozen importlib._bootstrap_external>", line 790, in exec_module
  File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
  File "test_module.py", line 1, in <module>
    import _hello_provider
ModuleNotFoundError: No module named '_hello_provider'
Т.е. в таком исполнении оно модуль _hello_provider не видит, и моей квалификации не хватает для того чтобы понять как это сделать чтобы да. Есть кто-то более опытный способный подсказать?


