Расширение Python с помощью C или C ++ включает в себя определение общей библиотеки, которая предоставляет функция инициализации по линии
PyMODINIT_FUNC
initspam(void)
{
(void) Py_InitModule("spam", SpamMethods);
}
Предполагая, что я выделяю ресурсы здесь, например, выделение глобального объекта через
g_bookkeeping = new Bookkeeping;
Каково было бы правильное место, чтобы написать соответствующий delete
заявление? Кажется, нет никакой ловушки для того, чтобы заметить, что модуль выгружен или есть?
Я кратко рассмотрел использование глобального объекта, как
Bookkeeping g_bookkeeping;
…но я хотел бы иметь точный контроль, когда этот объект построен или разрушен.
Документация Python говорит о доработке и упоминает Py_Finalize()
вызов которого — по крайней мере в Python 2.x — внутренние звонки PyImport_Cleanup
. Тем не менее, похоже, что это не так важно, как настройка выключения модуля.
Сообщение к вопросу от 2010 состояния для версии Python, которую вы используете:
[…]Примите, пожалуйста, к сведению, что Python действительно не поддерживает выгрузку модулей для серьезных, фундаментальных, непреодолимых технических проблем в 2.x.
[…]Вспомогательная разгрузка будет (и была) многолетним проектом. Не ожидайте никаких результатов в ближайшие пять лет.
Документация для Py_Finalize()
также упоминается как Ошибки и предостережения:
Динамически загружаемые модули расширения, загружаемые Python, не выгружаются.
Других решений пока нет …