и ещё раз про буст-питон: межмодульная регистрация классов
От: Кодт Россия  
Дата: 15.06.21 09:41
Оценка:
Разгребаю переезд на третий питон.

Модуль расширения (сошка) номер один, назовём её 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 такое не стреляло. Вариант "кривые руки" тоже не исключён, мне самому такой дизайн не очень нравится, но он уже есть.

Есть ли какие-то кошерные способы регистрировать наследников через границы модулей? Или же как-то обойти проблему?
http://files.rsdn.org/4783/catsmiley.gif Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.