Проблема была следующая: boost python загружался из одного exe-процесса, но разными DLL-библиотеками.Это означает, что у меня было 3 DLL-библиотеки, которые выполняли скрипты Python.Типы повышения Python работали без проблем до тех пор, пока DLL-библиотеки не были перезагружены (вызывая FreeLibrary и LoadLibrary внутри процесса без перезапуска процесса).Python boost имеет статическую переменную register
(регистр - это имя этой переменной) хранит ссылки на типы Python Boost.Когда исполняемый файл запускается, ссылки на типы добавляются в статическую переменную register
.Итак, эта проверка работает нормально:
boost::python::type_info infoVectorValue = boost::python::type_id<VectorClass>();
const boost::python::converter::registration* regVectorValue = boost::python::converter::registry::query(infoVectorValue);
if (regVectorValue == NULL || (*regVectorValue).m_to_python == NULL) {
Но когда DLL-библиотеки выгружаются, ссылки на эти типы форсирования Python остаются внутри статической переменной register
и приводят к освобождению адресов DLL-библиотек.,Это означает, что когда библиотека загружается снова, проверка типов получает ссылку на нужный тип (VectorClass
в моем примере) без проблем, но эта ссылка уже сломана.
Итак, решение этой проблемы состоит в том, чтобы увеличить ссылкуБиблиотека Python статически для каждой DLL-библиотеки - каждая DLL-библиотека имеет собственную статическую переменную register
, и для каждой DLL-библиотеки создаются ссылки на расширенные типы Python, а когда DLL-библиотека выгружается, переменная register
уничтожается для этой DLL.