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

Python中如何将Telebot函数放入线程?解决参数缺失报错问题

解决线程启动时的参数传递错误

错误原因分析

  • 第一个TypeError:azan()函数明确要求传入message参数,但启动线程时仅指定target=azan,未传递必需的参数,导致函数调用失败。
  • 第二个NameError:写成target=azan(message)时,Python会立即执行azan(message),再把函数返回值(此处为None)当作线程目标,同时此时message变量未被定义,因此触发错误。

正确解决步骤

  1. 确保message变量有效:azan函数需要用message.chat.id发送消息,所以必须先获取到合法的message对象(比如从Telegram Bot的消息回调中获取)。
  2. 用线程的args参数传参:启动线程时,通过args元组传递位置参数,让线程自动将参数传给azan函数。

修改后的代码示例

# 先确保这里已正确获取到有效的message对象
# 比如从Bot的消息处理逻辑中拿到该对象

def azan(message):
    timed1 = '17:52'
    timed2 = '22:09'
    bot.send_message(message.chat.id,"test ☾")
    while True:
        jt = datetime.now(tz)
        time_now = jt.strftime(dt_format)
        if timed1 == time_now:
            print ("[☾] It is time for Al Fajr prayer ")
            sleep(60)
        if timed2 == time_now:
            print ("[☾] It is time for Al thar prayer ")
            sleep(60)

MainFun_Run = threading.Thread(target=MainFun)
MainFun_Run.start()

# 重点:用args元组传递message参数,单个参数要加逗号保证是元组格式
azan_run = threading.Thread(target=azan, args=(message,))
azan_run.start()

注意事项

  • args必须是元组格式,即使只有一个参数也要加逗号(比如(message,)),否则Python会将其识别为单个变量而非元组。
  • 如果message对象是在MainFun内部生成的,需要提前将其传递到线程启动的作用域中,避免出现变量未定义的问题。

内容的提问来源于stack exchange,提问作者sMx_7d

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 04:55:24