我应该(或应该)如何在PyWin32中完成python?

我应该(或应该)如何在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

我们有一段代码使用PyWin32,偶尔也会调用Py_Finalize()和Py_Initialize()来重新初始化python。我们发现了一个bug,在该bug中,通过pywintypes(,第860行)中的
PyRun_string()
字符串创建的动态创建的类
class error
,在重新初始化后不会重新创建。该类在重新初始化后被使用,并在尝试调用函数
len()
时抛出“NoneType不可调用”错误

我们观察到,如果在调用
Py_Finalize()
之前,我们立即调用PyWinTypes export
PyWinGlobals_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是有原因的。不幸的是,它所指的“pycom-dev”邮件列表似乎不再存在。我认为这是一个正确的链接,但pythonpros.com似乎是一些sedo域名停车的东西

  • 注释掉的“old finalize code”在完成python之前确实调用了PyWinGlobals_Free(),这表明我们的修复可能是正确的。然而,除了源代码中这段神秘的代码片段之外,我们还无法在web上找到任何文档或信息,表明在使用PyWin32时,在完成python之前必须执行任何特殊操作。这里还进行了一些其他调用:FreeGatewayModules()和PyEval_RestoreThread()。我不确定我们是否应该自己称呼这些


  • 我们的修复看起来很有效,在没有更多信息的情况下,我们可能会继续使用它,但最好能得到一些确认。

    答案来自python-win32邮件列表:

    不幸的是,反复初始化和删除时会出现许多问题 终结Python,因此您在pywin32中看到的代码不再 试图支持它。简而言之,这样做是一件好事 不支持使用pywin32(至少在解决Python中的问题之前) 通过支持此功能的新模块API进行修复,pywin32是 (相应调整)

    马克[哈蒙德]


    您必须与PyWin32维护人员讨论这一点。这对于SO来说实在是太本地化了。我在这里问它是因为似乎没有任何方法可以获得PyWin32的支持(请参阅)。不过,听起来,位于的pywin32邮件列表可能是它的最佳位置。