Где я могу определить код для освобождения ресурсов, выделенных в функции инициализации модуля C Python?

Расширение 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. Тем не менее, похоже, что это не так важно, как настройка выключения модуля.

2

Решение

Сообщение к вопросу от 2010 состояния для версии Python, которую вы используете:

[…]

Примите, пожалуйста, к сведению, что Python действительно не поддерживает выгрузку модулей для серьезных, фундаментальных, непреодолимых технических проблем в 2.x.

[…]

Вспомогательная разгрузка будет (и была) многолетним проектом. Не ожидайте никаких результатов в ближайшие пять лет.

Документация для Py_Finalize() также упоминается как Ошибки и предостережения:

Динамически загружаемые модули расширения, загружаемые Python, не выгружаются.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]