Eel v0.14.0服务端在电脑睡眠后崩溃,页面报localhost拒绝连接错误
问题原因
该问题为Eel v0.14.0在Windows平台的已知共性缺陷,由两个底层逻辑导致:
- Eel内置的轻量Web服务未适配系统睡眠唤醒后的网络重置场景:电脑睡眠时系统会强制回收所有本地TCP连接,唤醒后原有socket监听状态异常,直接触发服务崩溃
- Eel默认开启了与Chrome前端的心跳检测机制:当睡眠导致心跳包连续丢失超过阈值后,Eel会自动终止主进程,因此会出现命令行窗口直接消失、页面请求被拒绝的情况
解决方案
方案1:快速适配(无额外依赖,无需升级版本)
启动Eel时禁用心跳自动终止逻辑即可,仅需修改eel.start的传入参数:
import eel eel.init('web') # 保持原有初始化逻辑不变 # 新增heartbeat_interval参数设为None,关闭心跳检测 eel.start('index.html', heartbeat_interval=None)
修改后心跳断连不会触发主进程退出,睡眠唤醒后刷新页面即可正常访问。
方案2:保留心跳检测并适配唤醒场景
如果需要保留心跳检测机制防止前端异常退出,可新增Windows电源事件监听,唤醒后自动重启Eel服务,代码示例如下:
import ctypes from ctypes import wintypes import eel import threading def power_event_listener(): user32 = ctypes.WinDLL('user32', use_last_error=True) WM_POWERBROADCAST = 0x0218 PBT_APMRESUMEAUTOMATIC = 0x0012 WndProcType = ctypes.WINFUNCTYPE(wintypes.LRESULT, wintypes.HWND, wintypes.UINT, wintypes.WPARAM, wintypes.LPARAM) def wnd_proc(hwnd, msg, wparam, lparam): if msg == WM_POWERBROADCAST and wparam == PBT_APMRESUMEAUTOMATIC: # 唤醒后重置Eel连接并重启服务 if hasattr(eel, '_websockets'): eel._websockets.close() threading.Thread(target=lambda: eel.start('index.html', heartbeat_interval=30), daemon=True).start() return user32.DefWindowProcW(hwnd, msg, wparam, lparam) wc = wintypes.WNDCLASSW() wc.lpfnWndProc = WndProcType(wnd_proc) wc.lpszClassName = "EelPowerMonitor" wc.hInstance = ctypes.windll.kernel32.GetModuleHandleW(None) atom = user32.RegisterClassW(ctypes.byref(wc)) hwnd = user32.CreateWindowExW(0, atom, "EelPowerWindow", 0, 0, 0, 0, 0, None, None, wc.hInstance, None) msg = wintypes.MSG() while user32.GetMessageW(ctypes.byref(msg), None, 0, 0) > 0: user32.TranslateMessage(ctypes.byref(msg)) user32.DispatchMessageW(ctypes.byref(msg)) # 启动电源事件监听线程 threading.Thread(target=power_event_listener, daemon=True).start() # 原有Eel启动逻辑 eel.init('web') eel.start('index.html', heartbeat_interval=30)
方案3:版本升级修复
Eel v0.16.0及以上版本已官方修复该缺陷,直接升级Eel版本即可解决,无需修改业务代码:
pip install eel --upgrade
内容的提问来源于stack exchange,提问作者CartClash
相关产品推荐
相关产品推荐

