Windows平台PyInstaller打包exe运行报错:无法导入SelectorEventLoop
解决PyInstaller打包exe后ImportError: cannot import name 'SelectorEventLoop'的问题
我之前也踩过这个坑,PyInstaller在打包依赖websockets的Python脚本时,经常会漏掉asyncio的一些内部子模块,导致运行exe时出现这个导入错误。下面是几个亲测有效的解决方法:
方法一:通过命令行直接指定隐藏导入
打包的时候直接给PyInstaller加上--hidden-import参数,明确告诉它要包含asyncio.selector_events模块:
pyinstaller --hidden-import=asyncio.selector_events my.py
这个方法适合快速测试,不用手动修改配置文件。
方法二:修改.spec配置文件
如果已经生成了.spec文件(第一次打包后会自动生成),可以手动编辑它来添加隐藏导入:
- 找到你的
my.spec文件,打开后定位到Analysis部分,类似这样:a = Analysis( ['my.py'], pathex=[], binaries=[], datas=[], hiddenimports=[], # 这里是需要修改的位置 hookspath=[], hooksconfig={}, runtime_hooks=[], excludes=[], win_no_prefer_redirects=False, win_private_assemblies=False, cipher=block_cipher, noarchive=False, ) - 在
hiddenimports列表中添加'asyncio.selector_events':hiddenimports=['asyncio.selector_events'], - 保存文件后,用这个.spec文件重新打包:
pyinstaller my.spec
这种方法适合需要多次打包的场景,一次修改后后续打包都能复用配置。
额外注意事项
- 确保你在正确的虚拟环境中执行打包命令,websockets、asyncio等依赖都已正常安装;
- 如果上述方法无效,可以尝试额外添加websockets的隐藏导入:
--hidden-import=websockets,不过大部分情况下第一个隐藏导入就足以解决问题; - 打包完成后务必测试生成的exe文件,确认错误是否消失。
内容的提问来源于stack exchange,提问作者Sylvain Biehler
相关产品推荐
相关产品推荐

