如何在Mac上通过launchd每日定时执行Python脚本?
在Mac上配置每日7点运行Python脚本的定时任务
一、先搞定两个关键路径
首先得确认两个核心路径,不然定时任务找不到要运行的东西:
- Python解释器路径:打开终端,输入
which python3或者which python,终端会输出类似/usr/local/bin/python3的路径,这就是你要用到的Python执行路径。 - 脚本存放路径:把你的Python脚本放到一个固定文件夹里(比如用户目录下新建个
Scripts文件夹),比如~/Scripts/nightly_task.py。然后在终端输入realpath ~/Scripts/nightly_task.py,就能得到完整的绝对路径,比如/Users/你的用户名/Scripts/nightly_task.py。
二、用Mac原生launchd配置定时任务
launchd是Mac自带的定时任务管理工具,稳定性比第三方工具强,步骤如下:
- 创建plist配置文件
打开文本编辑器(比如TextEdit,记得切换到纯文本模式),复制下面的代码,把里面的路径替换成你刚才查到的实际路径:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>Label</key> <string>com.yourname.nightlyscript</string> <!-- 改成唯一标识,比如你的名字+脚本名 --> <key>ProgramArguments</key> <array> <string>/usr/local/bin/python3</string> <!-- 替换成你的Python路径 --> <string>/Users/你的用户名/Scripts/nightly_task.py</string> <!-- 替换成你的脚本绝对路径 --> </array> <key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>19</integer> <!-- 19点对应晚上7点 --> <key>Minute</key> <integer>0</integer> <!-- 整点运行 --> </dict> <!-- 可选:添加日志路径,方便后续监控 --> <key>StandardOutPath</key> <string>/Users/你的用户名/Scripts/script_out.log</string> <key>StandardErrorPath</key> <string>/Users/你的用户名/Scripts/script_err.log</string> </dict> </plist>
保存文件,命名要和里面的Label一致(比如com.yourname.nightlyscript.plist),然后把文件放到~/Library/LaunchAgents/目录下(这是用户级任务目录,不需要管理员权限)。
- 加载并启动任务
打开终端,依次输入这几个命令:
- 加载配置:
launchctl load ~/Library/LaunchAgents/com.yourname.nightlyscript.plist - 确认加载成功:
launchctl list | grep com.yourname.nightlyscript
如果输出任务的PID等信息,说明加载没问题。
- 后续管理命令
- 临时停止任务:
launchctl stop com.yourname.nightlyscript - 卸载任务(不想用了):
launchctl unload ~/Library/LaunchAgents/com.yourname.nightlyscript.plist
三、监控任务运行情况
日志查看
刚才配置的StandardOutPath和StandardErrorPath会记录脚本的正常输出和错误信息。可以直接打开日志文件查看,或者在终端用tail -f /Users/你的用户名/Scripts/script_out.log实时刷新查看最新输出。系统控制台查触发记录
打开Mac自带的「控制台」应用,在搜索框输入你plist里的Label(比如com.yourname.nightlyscript),就能看到launchd关于这个任务的启动、停止日志,判断任务是否按时触发。脚本内加运行标记
可以在你的Python脚本里加一行代码,每次运行时写入时间戳到记录文件:
from datetime import datetime with open("/Users/你的用户名/Scripts/run_record.txt", "a") as f: f.write(f"脚本运行时间:{datetime.now()}\n")
每天7点后打开这个记录文件,就能确认脚本是否真的执行了。
内容的提问来源于stack exchange,提问作者Cauder
相关产品推荐
相关产品推荐

