我应该(或应该)如何在PyWin32中完成python?
我们有一段代码使用PyWin32,偶尔也会调用Py_Finalize()和Py_Initialize()来重新初始化python。我们发现了一个bug,在该bug中,通过pywintypes(,第860行)中的我应该(或应该)如何在PyWin32中完成python?,python,pywin32,Python,Pywin32,我们有一段代码使用PyWin32,偶尔也会调用Py_Finalize()和Py_Initialize()来重新初始化python。我们发现了一个bug,在该bug中,通过pywintypes(,第860行)中的PyRun_string()字符串创建的动态创建的类class error,在重新初始化后不会重新创建。该类在重新初始化后被使用,并在尝试调用函数len()时抛出“NoneType不可调用”错误 我们观察到,如果在调用Py_Finalize()之前,我们立即调用PyWinTypes exp
PyRun_string()
字符串创建的动态创建的类class error
,在重新初始化后不会重新创建。该类在重新初始化后被使用,并在尝试调用函数len()
时抛出“NoneType不可调用”错误
我们观察到,如果在调用Py_Finalize()
之前,我们立即调用PyWinTypes exportPyWinGlobals_Free()
,则错误停止发生
在PyWin32代码库(中)的其他地方,有以下函数,在regsvr32.exe中进行COM注册/注销后进行清理时调用该函数:
void PyCom_DLLReleaseRef(void)
{
/*** NOTE: We no longer finalize Python EVER in the COM world
see pycom-dev mailing list archives from April 2000 for why
***/
// Must be thread-safe, although cant have the Python lock!
// only needed when we finalize.
// CEnterLeaveFramework _celf;
LONG cnt = InterlockedDecrement(&g_cLockCount);
// Not optimal, but anything better is hard - g_cLockCount
// could always transition 1->0->1 at some stage, screwing this
// up. Oh well...
if (cnt==0) {
// Send a quit message to the registered thread (if we have one)
if (dwQuitThreadId)
PostThreadMessage(dwQuitThreadId, WM_QUIT, 0, 0);
/*** Old finalize code
if (bDidInitPython) {
PyEval_RestoreThread(ptsGlobal);
PyWinGlobals_Free();
FreeGatewayModule();
Py_Finalize();
bDidInitPython=FALSE;
}
***/
}
}
这里有两件值得注意的事情:
我们的修复看起来很有效,在没有更多信息的情况下,我们可能会继续使用它,但最好能得到一些确认。答案来自python-win32邮件列表: 不幸的是,反复初始化和删除时会出现许多问题 终结Python,因此您在pywin32中看到的代码不再 试图支持它。简而言之,这样做是一件好事 不支持使用pywin32(至少在解决Python中的问题之前) 通过支持此功能的新模块API进行修复,pywin32是 (相应调整) 马克[哈蒙德]
您必须与PyWin32维护人员讨论这一点。这对于SO来说实在是太本地化了。我在这里问它是因为似乎没有任何方法可以获得PyWin32的支持(请参阅)。不过,听起来,位于的pywin32邮件列表可能是它的最佳位置。