Python中如何将Telebot函数放入线程?解决参数缺失报错问题
解决线程启动时的参数传递错误
错误原因分析
- 第一个
TypeError:azan()函数明确要求传入message参数,但启动线程时仅指定target=azan,未传递必需的参数,导致函数调用失败。 - 第二个
NameError:写成target=azan(message)时,Python会立即执行azan(message),再把函数返回值(此处为None)当作线程目标,同时此时message变量未被定义,因此触发错误。
正确解决步骤
- 确保
message变量有效:azan函数需要用message.chat.id发送消息,所以必须先获取到合法的message对象(比如从Telegram Bot的消息回调中获取)。 - 用线程的
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
相关产品推荐
相关产品推荐

