提问人:MYK 提问时间:8/31/2022 更新时间:9/2/2022 访问量:640
如何安排一些 python 脚本在 Windows PC 上定期运行?
How do you schedule some python scripts to run regularly on a Windows PC?
问:
我有一些 python 脚本,我希望每天从 Windows PC 上运行。
我目前的工作流程是:
- 台式电脑每天都会保持状态,除了周末每周重启一次
- 重新启动后,我打开 VS Code 并运行一个小的 bash 脚本来启动任务。
./start.sh
以上效果相当好,但也相当痛苦。如果我关闭 VS Code,我需要重新运行(例如,用于更新)。此外,这些进程使用一些本地 python 库,因此如果我要更新它们,我需要停止它们。start.sh
关于如何正确地做到这一点,我想到了 4 个工具:
- Windows 计划程序
- 气流
- 省长 (https://www.prefect.io/)
- 火箭 (https://rocketry.readthedocs.io/en/stable/)
但是,我无法完全解决 Prefect/Airflow/Rocketry 在我的 PC 上运行的基本问题,那么在 PC 重新启动后,没有什么可以重新启动它们。我也不确定他们是否会在这些工具上给我我想要的隔离。
我想到了 Docker,我可以将每个任务放入 docker 映像中,并通过某种形式的 docker swarm 或类似的东西运行它们。但不确定我是否在重新发明轮子。
我 100% 确定我不是这种情况的第一个人。谁能给我指出一个关于如何做好这项工作的指南?
注意:
- 我不考虑在云中运行 python 脚本。它们与仅许可用于我的 PC 的本地工具进行交互。
答:
您绝对可以使用 Prefect - 它非常轻巧,似乎符合您的要求。您可以使用 启动 Orion API 服务器进行安装,一旦您创建了 Deployment,并启动了代理,您甚至可以从 UI 配置调度pip install prefect
prefect orion start
prefect agent start -q default
有关部署的更多信息,请查看我们的常见问题解答部分。
评论
听起来 Rocketry 也可能是合适的。火箭可以使用任务自行关闭。您可以执行以下任务:
在主线程和进程上运行(阻止启动新任务)
等待或终止所有当前正在运行的任务(使用会话)
为调度程序设置标志的调用。
session.shut_down()
还有一个应用程序配置,它只是一个条件。如果此条件为 True,则计划程序将退出,因此您也可以使用它。
shut_cond
然后,在该行之后,您只需使用子进程库在 shell 上运行 (restart) 命令即可。然后,您需要在重新启动完成后再次启动 Rocketry 的东西。为此,也许这可能是一个答案:https://superuser.com/a/954957,或者使用 Windows 调度程序来启动 Rocketry 的简单启动任务。app.run()
shutdown -r
特别是如果你有Linux机器(例如Raspberry Pis),你可以将Rocketry与FastAPI集成,并创建一个小型集群,其中Rocketry应用程序相互通信,只需将脚本与Rocketry一起作为启动服务即可。一台计算机可能是调用另一台计算机的 API 的备份,该计算机运行 Linux restart 命令。然后,备份将执行任务,直到主计算机再次响应请求(启动并运行)。
但作为图书馆的作者,我可能偏向于我自己的项目。但是 Rocketry 非常有能力解决复杂的调度问题,这就是该项目的目的。
您可以使用 schtasks for windows 来安排任务,例如运行 bash 脚本或 python 脚本,而且它也非常可靠。
评论
app.py
{PATH TO PYTHON}/python.exe app.py