Py2exe兼容pywin32方案咨询:递归深度超限错误
解决Py2exe与pywin32兼容的递归深度溢出问题
我之前也踩过py2exe和pywin32兼容的这个坑!那个RuntimeError: maximum recursion depth exceeded in comparison错误确实让人头大,不过亲测几个办法能解决,你可以挨个试试:
手动指定pywin32模块,避免自动递归扫描
py2exe在自动分析依赖时,对pywin32的部分模块(比如win32api、win32gui)会陷入循环引用的递归扫描,直接触发栈溢出。你可以在setup.py里明确列出需要用到的pywin32模块,不让py2exe去自动追踪它们的依赖链:from distutils.core import setup import py2exe setup( console=['你的脚本文件名.py'], # 如果是GUI程序就换成windows=['你的脚本文件名.py'] options={ 'py2exe': { 'includes': ['win32api', 'win32gui', 'win32con'], # 替换成你实际用到的模块 'skip_archive': True, # 这个参数能进一步减少递归分析的压力 } } )这样py2exe就不会过度扫描依赖,从根源上减少递归触发的可能。
延迟导入pywin32模块
如果你在脚本开头就导入pywin32模块,py2exe会立刻启动对该模块的全依赖分析,很容易触发递归。试试把pywin32的导入放到函数内部,或者用动态导入的方式:def 需要用到win32的函数(): import win32api # 这里写你的业务代码或者用动态导入:
win32api = __import__('win32api')这样能避开py2exe初始阶段的深度依赖扫描,避免递归溢出。
使用兼容的版本组合
新版本的pywin32和py2exe可能存在兼容性问题,我当时降级到稳定的旧版本组合就解决了问题。你可以在虚拟环境里安装:pip install py2exe==0.6.9 pip install pywin32==227这个版本搭配对pywin32的支持很稳定,基本不会出现递归溢出的情况。
如果上面的办法都没效果,也可以考虑换成PyInstaller——它对pywin32的原生支持更好,很少会出现这类递归问题。不过如果一定要用py2exe的话,上面的方法应该能帮你解决。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

