Разгребаю переезд на третий питон.
Модуль расширения (сошка) номер один, назовём её module_a: регистрирует класс A.
BOOST_PYTHON_MODULE(module_a) {
boost::python::class_(A, .....);
}
Сошка номер два, module_b: регистрирует класс B, унаследованный от A.
Для этого ей нужно, чтобы класс A уже был зарегистрирован в буст-питоне.
BOOST_PYTHON_MODULE(module_b) {
boost::python::import("module_a");
boost::python::class_(B, boost::python::bases<A>, .....);
}
Если не выполнить импорт, то буст-питон кинет исключение SystemError.
Если выполнить, то при завершении произойдёт расстрел памяти из-за жидкой связи из-за модулями, которые выгружаются в каком-то не таком порядке.
Способ загрузки-и-регистрации модуля module_a не принципиален. Можно закомментировать эту строчку и написать в скрипте
import module_a # перед module_b
import module_b
и тоже покрешится.
Питон 3.6, буст 1.65, убунту 20.04.
Может быть, это ошибка в бусте, может, в питоне, я хз. В питоне 2.7 такое не стреляло. Вариант "кривые руки" тоже не исключён, мне самому такой дизайн не очень нравится, но он уже есть.
Есть ли какие-то кошерные способы регистрировать наследников через границы модулей? Или же как-то обойти проблему?