You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用async异步写法的前提下调用pyromod的ask方法

问题核心结论
  • pyromod的ask是基于asyncio实现的原生异步协程方法,无法直接在同步函数中裸调用,直接运行你贴的原始代码会抛出协程未被等待的警告,也拿不到执行结果。
  • 不需要将get_code改写为async异步函数,通过事件循环补丁即可在同步函数内同步调用ask方法,完全保留现有同步代码结构。
具体实现步骤
  1. 先安装事件循环嵌套补丁依赖,解决运行中的asyncio循环无法同步等待协程结果的问题:
pip install nest-asyncio
  1. 修正原代码的语法错误(导入语句多余逗号、缺失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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:18:26