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

Python schedule模块是否等待代码执行完成并捕获返回码?

问题解答

关于执行逻辑的疑问解答

  • 你提到的子进程等待行为和schedule模块没有直接关联,由你调用脚本的os.system方法决定:os.system本身是阻塞调用,会一直等待启动的子进程完全执行结束后,才会返回子进程的退出状态码,你代码中拿到的ret可以正确反映脚本的执行结果。
  • 默认schedule模块采用单线程同步执行逻辑,它执行你注册的任务函数时,会等整个函数的所有逻辑执行完毕,才会进入下一次调度的等待周期,不会触发任务后立刻返回。

多个脚本顺序触发的实现方案

因为os.system天然阻塞,你只要在同一个调度任务函数里按你需要的顺序依次调用脚本即可,前一个脚本执行完毕后才会自动执行下一个,示例代码如下:

import os
import schedule
import time

# 可复用的脚本执行方法
def run_script(script_path, venv_path):
    print(f"LOG:: 开始执行脚本:{script_path}")
    ret = os.system(f"{venv_path} {script_path}")
    # 原代码判断条件冗余,os.system返回非0即代表执行异常
    if ret != 0:
        print(f"LOG:: 脚本{script_path}执行失败,返回码:{ret}")
        # 抛出异常可中断后续脚本执行,不需要中断可以注释该行
        raise RuntimeError(f"脚本{script_path}执行异常")
    print(f"LOG:: 脚本{script_path}执行成功")

def sequential_schedule_job():
    # 替换为你自己的虚拟环境路径
    v_venv_path = "你的虚拟环境python解释器路径"
    try:
        # 按顺序填写需要执行的脚本即可
        run_script("第一个业务脚本路径", v_venv_path)
        run_script("第二个业务脚本路径", v_venv_path)
        run_script("日志清理脚本路径", v_venv_path)
        print("LOG:: 本轮所有任务执行完成")
    except Exception as e:
        print(f"LOG:: 本轮任务中断,错误信息:{str(e)}")

# 注册调度任务
schedule.every(2).hours.do(sequential_schedule_job)

# 调度主循环
if __name__ == "__main__":
    while True:
        schedule.run_pending()
        time.sleep(1)

补充注意事项

如果你的任务执行时长可能超过调度间隔(比如2小时的间隔,但任务执行了3小时还没结束),可以添加一个执行状态标记位,避免同一时间多个任务重复执行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 09:45:08