如何修复Telethon中Lock.__init__()意外收到'loop'参数的TypeError?
问题:Telethon启动时触发Lock初始化错误
基于Python 3.10使用Telethon库开发Telegram用户在线状态追踪程序,启动时触发如下错误:
TypeError: Lock.__init__() got an unexpected keyword argument 'loop'
已更新所有pip依赖,但问题仍未解决。程序代码及报错堆栈如下:
程序代码
from telethon import TelegramClient from telethon.tl.types import UserStatusOnline from datetime import datetime from time import sleep API_ID = 12345678 API_HASH = '123456789' USERNAMES = [ 'your_username' ] PAIRS = [ ] TRACK_FREQUENCY = 5 client = TelegramClient('bot', API_ID, API_HASH) async def main(): while True: online = [] offline = [] for i in USERNAMES: entity = await client.get_entity(i) name = entity.first_name + ' ' + entity.last_name if isinstance(entity.status, UserStatusOnline): # print if user tracked is online print('[' + datetime.now().isoformat() + ']: ' + name + ' в онлайне!') online.append(entity.username) else: offline.append(entity.username) for u in PAIRS: # check if both users in the given pair are online right now if u[0] in online and u[1] in online: print('[' + datetime.now().isoformat() + ']: ' + u[0] + ' и ' + u[1] + ' оба сейчас находятся в онлайне!') elif u[0] in offline and u[1] in offline: print('[' + datetime.now().isoformat() + ']: ' + u[0] + ' и ' + u[1] + ' оба сейчас находятся в офлайне!') sleep(TRACK_FREQUENCY) if __name__ == "__main__": print("Трекер начал работу...") client.start() print("Трекер успешно подключился к Telegram'у!") with client: client.loop.run_until_complete(main())
报错堆栈
Traceback (most recent call last): File "/workspaces/TG_Online_Tracker1/main.py", line 29, in <module> client = TelegramClient('bot', API_ID, API_HASH) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/home/codespace/.local/lib/python3.12/site-packages/telethon/client/telegrambaseclient.py", line 302, in __init__ self._sender = MTProtoSender( ^^^^^^^^^^^^^^ File "/home/codespace/.local/lib/python3.12/site-packages/telethon/network/mtprotosender.py", line 58, in __init__ self._connect_lock = asyncio.Lock(loop=loop) ^^^^^^^^^^^^^^^^^^^^^^^ TypeError: Lock.__init__() got an unexpected keyword argument 'loop'
原因分析
错误源于Telethon版本与Python运行环境不兼容:
- 报错路径显示依赖安装在Python3.12的site-packages目录下,说明实际运行环境是Python3.12,而非预期的3.10。
- 新版Python(3.12+)的asyncio库中,
Lock类的构造函数已移除loop参数,但当前安装的Telethon版本仍在使用asyncio.Lock(loop=loop)的旧写法。
解决方案
方案1:安装适配Python3.12的Telethon开发版
执行以下命令安装Telethon的最新开发分支,该分支已修复此兼容性问题:
pip install git+https://github.com/LonamiWebs/Telethon.git
方案2:降级Python版本到3.11及以下
若不想使用开发版,可将Python版本降级至3.11或更低,这些版本的asyncio仍支持Lock(loop=loop)的写法,与旧版Telethon兼容。
额外优化:替换同步sleep为异步sleep
原代码中main函数是异步函数,但使用time.sleep()会阻塞事件循环,建议替换为asyncio的异步sleep:
- 添加asyncio导入:
import asyncio
- 替换
sleep(TRACK_FREQUENCY)为:
await asyncio.sleep(TRACK_FREQUENCY)
内容的提问来源于stack exchange,提问作者kitdoom
相关产品推荐
相关产品推荐

