Python定时每日发送邮件报错‘the first argument must be callable’及运行问题咨询
问题修复与说明
一、"the first argument must be callable" 错误修复方法
schedule库的do()方法要求传入可调用的函数对象,你直接写email_new(df)是在调用函数并把返回值(你的函数无返回值,实际传入的是None)传给了do(),这就触发了错误。以下是几种可行的修复方式:
方式1:使用lambda表达式包装
用lambda把带参数的函数调用包装成无参的可调用对象,让do()能正确识别:
schedule.every().day.at('17:40').do(lambda: email_new(df))
方式2:用functools.partial绑定参数
从functools模块导入partial,它可以预先把函数和参数绑定,生成新的可调用对象:
from functools import partial schedule.every().day.at('17:40').do(partial(email_new, df=df))
方式3:调整函数为无参(不推荐)
如果df是全局变量,可以修改email_new函数去掉参数,直接在函数内部使用全局的df,这样就能直接传函数名:
# 先将df定义为全局变量 df = ... # 你的DataFrame数据 def email_new(): # 移除参数 message = MIMEMultipart() # 后续代码不变,直接使用全局的df html = MIMEText(df.to_html(index=False), "html") # ... 其余代码保持不变 schedule.every().day.at('17:40').do(email_new)
这种方式会增加代码耦合性,后期维护麻烦,优先推荐前两种方式。
二、关闭程序后脚本能否继续执行?
不能。当前脚本依赖while True循环持续运行来检测定时任务,一旦关闭程序,循环终止,定时任务自然不会再执行。
如果需要关闭程序后仍能每日自动执行,需要借助系统级定时任务工具:
- Windows:使用「任务计划程序」,设置定时启动你的Python脚本
- Linux:使用
cron配置定时任务运行脚本 - macOS:使用
launchd配置定时任务运行脚本
内容的提问来源于stack exchange,提问作者Jean-Paul Azzopardi
相关产品推荐
相关产品推荐

