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
相关产品推荐
相关产品推荐

