排程:讓腳本每天自己跑
把上一堂的天氣腳本設定成每天早上自動執行:Windows 用工作排程器,macOS 和 Linux 用 cron,並把結果寫進紀錄檔。
自動化的最後一哩路
到目前為止,你的腳本都要自己打開終端機、輸入指令才會執行。真正的自動化,是你不用記得,它自己會跑。
這堂課要把上一堂的天氣腳本,變成每天早上 8 點自動執行,把「今天要不要帶傘」記錄下來。學會之後,同樣的方法可以用在每天備份檔案、每週整理報表、每月產生記帳摘要。
排程工具負責「準時叫醒」,腳本負責做事,紀錄檔負責「告訴你發生了什麼」。
第一步:讓腳本準備好「無人看管」
排程執行時,沒有人看著終端機。這會帶來兩個新手常踩的坑。
坑一:print 的東西沒人看得到
解法是改用 Python 內建的 logging,把訊息寫進檔案,每一行還會自動加上時間:
import logging
from pathlib import Path
import requests
BASE = Path(__file__).resolve().parent
logging.basicConfig(
filename=BASE / "weather.log",
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s",
encoding="utf-8",
)
URL = "https://api.open-meteo.com/v1/forecast"
params = {
"latitude": 25.04,
"longitude": 121.56,
"daily": "temperature_2m_max,temperature_2m_min,precipitation_probability_max",
"timezone": "Asia/Taipei",
"forecast_days": 1,
}
try:
resp = requests.get(URL, params=params, timeout=10)
resp.raise_for_status()
daily = resp.json()["daily"]
except requests.exceptions.RequestException as e:
logging.error(f"取得天氣失敗:{e}")
else:
high = daily["temperature_2m_max"][0]
low = daily["temperature_2m_min"][0]
rain = daily["precipitation_probability_max"][0]
logging.info(f"今天 {low}~{high} 度,降雨機率 {rain}%")
if rain >= 50:
logging.warning("記得帶傘!")
把它存成 weather.py,先手動執行一次,資料夾裡會多出 weather.log:
2026-11-08 08:00:01,234 INFO 今天 19.8~25.6 度,降雨機率 60%
2026-11-08 08:00:01,236 WARNING 記得帶傘!
logging 有不同等級:info 是一般訊息、warning 是要注意、error 是出錯了。之後看紀錄檔時,搜尋 ERROR 就能快速找到問題。try 後面的 else 意思是「沒有出錯的話,才做這段」。
坑二:排程不一定從你的資料夾執行
手動執行時,終端機站在你的專案資料夾;但排程工具執行時,「目前位置」可能是系統資料夾。如果程式寫 open("weather.log"),檔案可能會跑到你找不到的地方,或是因為權限不足而失敗。
所以上面的程式用了 Path(__file__).resolve().parent,意思是「這支腳本所在的資料夾」。所有檔案路徑都從這裡組出來,不管從哪裡執行都不會錯。
第二步:找出完整路徑
排程工具需要知道 Python 和腳本「確切在哪裡」。在終端機執行下面這行(Mac 用 python3),它會印出 Python 的完整路徑:
python -c "import sys; print(sys.executable)"
C:\Users\amy\AppData\Local\Programs\Python\Python313\python.exe
再記下 weather.py 的完整路徑,例如 C:\Users\amy\auto\weather.py。在 VS Code 的檔案總管對檔案按右鍵,選「複製路徑」最快。
第三步之一:Windows 工作排程器
- 按開始鍵,搜尋並打開「工作排程器」。
- 選「建立基本工作」,取個名字,例如「每日天氣」。
- 觸發程序選「每天」,時間設 8:00。
- 動作選「啟動程式」:
- 程式或指令碼:填 Python 的完整路徑
- 新增引數:填
weather.py的完整路徑 - 開始位置:填
weather.py所在的資料夾路徑
- 完成後,在工作清單找到它,按右鍵選「執行」,馬上測試一次,再打開
weather.log確認有新的一行。
不同版本的 Windows 介面文字可能略有不同,概念是一樣的:什麼時候(觸發程序)、做什麼(動作)。
第三步之二:macOS 和 Linux 的 cron
cron 是 macOS 和 Linux 內建的排程工具。打開終端機,輸入:
crontab -e
會開啟一個編輯器,加入這一行(路徑換成你自己的):
0 8 * * * /usr/local/bin/python3 /Users/amy/auto/weather.py
存檔離開就設定好了。用 crontab -l 可以列出目前所有排程。
開頭那五個欄位是「什麼時候執行」,最容易讓人看不懂:
請 AI 幫你寫排程設定
cron 的時間格式和工作排程器的選項都很容易忘,這種「查語法」的事,交給 AI 很適合。
我用 macOS,Python 路徑是 /usr/local/bin/python3,腳本在 /Users/amy/auto/report.py。我想讓它在每週一到週五早上 9 點 30 分執行,並把終端機輸出也存到同一個資料夾的 cron.log。請給我 crontab 要加的那一行,並逐欄解釋每個部分的意思。
拿到答案後,先把時間設成「兩分鐘後」測試一次,確認真的有跑、紀錄檔真的有寫入,再改回正式的時間。
- 把天氣腳本改成用
logging寫入weather.log,並用Path(__file__)組出路徑,手動執行確認。 - 依照你的作業系統,設定每天早上自動執行。
- 先把時間設成幾分鐘後,等它執行,打開
weather.log確認多了一行。 - 加分題:把 Wi-Fi 關掉再手動執行一次,看看紀錄檔裡的
ERROR長什麼樣子。這就是錯誤處理和紀錄檔的價值。
讀完了嗎?
標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。
留言與討論
卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。