PyInstaller打包的TeleBot程序运行1周后出现Telegram传输错误问题
根因判定
该问题与Telegram API限制无关,属于PyInstaller打包后程序底层网络资源泄漏导致的系统级错误。
报错逻辑拆解
两个报错的底层诱因一致,只是不同模块的上层抛出形式有区别:
- 使用python-telegram-bot模块的
urllib3 HTTPError [Errno 2] No such file or directory:
本质是进程累计打开的文件描述符耗尽,系统无法为新的网络请求分配套接字资源(套接字在操作系统中以文件描述符形式管理),urllib3创建连接失败抛出该错误。
对应调用代码:bot = telebot.TeleBot(bot_api, parse_mode=None) bot.send_message(channel_id, t) - 使用telebot模块的
'OSError' object has no attribute 'result_json':
底层同样是文件描述符耗尽导致的OSError,telebot模块错误地将异常对象当成了API响应对象,尝试读取result_json属性时抛出该派生错误。
对应调用代码:bot = telegram.Bot(token=bot_api) bot.sendMessage(chat_id=channel_id, text=t)
固定7天触发的原因
你使用的PyInstaller 4.3版本与Python 3.9.5搭配时,urllib3的连接池复用逻辑存在打包适配bug:超时闲置的连接没有正确释放对应的文件描述符,每次网络请求都会泄漏少量描述符,累计运行7天后刚好触达单个进程的文件描述符上限,因此会固定周期报错,和消息发送总次数无关。
修复方案
- 临时规避:添加定时任务,每24小时自动重启一次机器人进程,主动释放所有占用的系统资源
- 代码层面修复:每次调用消息发送接口后手动清理闲置连接,python-telegram-bot模块调用
bot.session.close(),telebot模块调用bot._request._conn_pool.clear() - 根本修复:将PyInstaller升级到5.0+版本,同时将urllib3升级到1.26.10+版本,该版本已修复打包场景下的文件描述符泄漏问题
内容的提问来源于stack exchange,提问作者Pro DsLee
相关产品推荐
相关产品推荐

