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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 18:45:42