У меня есть приложение MFC, где мы встраиваем модуль Python в C ++, сам питон перехватывается с помощью задержки загрузки DLL. Инициализация & настройка методов работает нормально. Однако настоящая проблема возникает, когда я хочу очистить модуль перед финализацией Python Interpreter.
Код для определения моего модуля выглядит следующим образом:
m_module_def = {
PyModuleDef_HEAD_INIT,
m_module_name.c_str(),
const_cast<char *>(module_doc),
-1,
m_method_table.table(),
NULL,
NULL,
myextension_clear,
NULL
};
И подпись к функции myextension_clear выглядит следующим образом:
#if PY_MAJOR_VERSION >= 3
#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
#else
#define GETSTATE(m) (&_state)
static struct module_state _state;
#endif
#if PY_MAJOR_VERSION >= 3
static int myextension_clear(PyObject *m) {
Py_CLEAR(GETSTATE(m)->error);
return 0;
}
#endif
Я следовал за Python API, а затем для финальной части, они не говорят об очистке, когда вы находитесь в Windows и загружены с задержкой.
Если я подключу функцию очистки, я получу следующую ошибку:
не может задержать загрузку ‘python36_d.dll’ из-за импорта символа данных ‘__Imp__Py_RefTotal’; ссылка без /DELAYLOAD:python36_d.dll
Теперь мой вопрос: кто-то уже сделал встраивание в Python 3+ или как бы вы правильно очистили модуль перед финализацией интерпретатора Python?
Задача ещё не решена.
Других решений пока нет …