如何在不使用async异步写法的前提下调用pyromod的ask方法
问题核心结论
- pyromod的
ask是基于asyncio实现的原生异步协程方法,无法直接在同步函数中裸调用,直接运行你贴的原始代码会抛出协程未被等待的警告,也拿不到执行结果。 - 不需要将
get_code改写为async异步函数,通过事件循环补丁即可在同步函数内同步调用ask方法,完全保留现有同步代码结构。
具体实现步骤
- 先安装事件循环嵌套补丁依赖,解决运行中的asyncio循环无法同步等待协程结果的问题:
pip install nest-asyncio
- 修正原代码的语法错误(导入语句多余逗号、缺失filters导入),在同步函数中通过事件循环同步执行
ask协程,修改后完整可运行代码如下:
import asyncio import nest_asyncio from pyrogram import Client, filters from pyromod import listen # 应用事件循环嵌套补丁 nest_asyncio.apply() # 替换为你自己的账号参数 api_id = 123456 api_hash = "your_api_hash" phone_number = "13800138000" client = Client(api_id, api_hash, phone_number) def get_code(chat_id): # 获取当前运行的事件循环,同步等待ask执行完成并返回结果 loop = asyncio.get_event_loop() code_msg = loop.run_until_complete( client.ask(chat_id, 'please Send me the code', timeout=30) ) # 此处可直接同步处理用户返回的验证码,和普通同步函数逻辑完全一致 print(f"收到用户提交的验证码:{code_msg.text}") return code_msg.text @client.on_message(filters.private) async def start(app, message): if message.text == '/start': # 直接调用同步函数即可,无需加await关键字 get_code(message.chat.id) client.run()
其他可选场景说明
- 如果你不需要同步获取
ask的返回结果,仅需要触发等待用户消息的逻辑,可以不用安装nest_asyncio,直接将get_code内的逻辑替换为创建异步任务即可:
def get_code(chat_id): asyncio.create_task(client.ask(chat_id, 'please Send me the code', timeout=30)) # 后续逻辑不会等待用户回复,会直接向下执行
- 未打nest_asyncio补丁时,不要直接在同步函数内调用
loop.run_until_complete,会抛出RuntimeError: This event loop is already running错误,导致程序崩溃。
内容的提问来源于stack exchange,提问作者anime
相关产品推荐
相关产品推荐

