所有入門單元免費開放 · 課程內容持續更新中

排程:讓腳本每天自己跑

把上一堂的天氣腳本設定成每天早上自動執行:Windows 用工作排程器,macOS 和 Linux 用 cron,並把結果寫進紀錄檔。

第 2.5 堂約 13 分鐘

自動化的最後一哩路

到目前為止,你的腳本都要自己打開終端機、輸入指令才會執行。真正的自動化,是你不用記得,它自己會跑。

這堂課要把上一堂的天氣腳本,變成每天早上 8 點自動執行,把「今天要不要帶傘」記錄下來。學會之後,同樣的方法可以用在每天備份檔案、每週整理報表、每月產生記帳摘要。

排程流程圖:每天早上 8 點,排程工具喚醒並執行 weather.py,腳本呼叫天氣 API,把結果寫入 weather.log,你之後打開紀錄檔查看

排程工具負責「準時叫醒」,腳本負責做事,紀錄檔負責「告訴你發生了什麼」。

第一步:讓腳本準備好「無人看管」

排程執行時,沒有人看著終端機。這會帶來兩個新手常踩的坑。

坑一: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 工作排程器

  1. 按開始鍵,搜尋並打開「工作排程器」。
  2. 選「建立基本工作」,取個名字,例如「每日天氣」。
  3. 觸發程序選「每天」,時間設 8:00。
  4. 動作選「啟動程式」:
    • 程式或指令碼:填 Python 的完整路徑
    • 新增引數:填 weather.py 的完整路徑
    • 開始位置:填 weather.py 所在的資料夾路徑
  5. 完成後,在工作清單找到它,按右鍵選「執行」,馬上測試一次,再打開 weather.log 確認有新的一行。

不同版本的 Windows 介面文字可能略有不同,概念是一樣的:什麼時候(觸發程序)、做什麼(動作)。

第三步之二:macOS 和 Linux 的 cron

cron 是 macOS 和 Linux 內建的排程工具。打開終端機,輸入:

crontab -e

會開啟一個編輯器,加入這一行(路徑換成你自己的):

0 8 * * * /usr/local/bin/python3 /Users/amy/auto/weather.py

存檔離開就設定好了。用 crontab -l 可以列出目前所有排程。

開頭那五個欄位是「什麼時候執行」,最容易讓人看不懂:

cron 時間格式圖解:五個欄位依序是分、時、日、月、星期,0 8 星號 星號 星號 代表每天 8 點 0 分;另附每週一 9 點、每 30 分鐘等例子

請 AI 幫你寫排程設定

cron 的時間格式和工作排程器的選項都很容易忘,這種「查語法」的事,交給 AI 很適合。

可以這樣問 Claude

我用 macOS,Python 路徑是 /usr/local/bin/python3,腳本在 /Users/amy/auto/report.py。我想讓它在每週一到週五早上 9 點 30 分執行,並把終端機輸出也存到同一個資料夾的 cron.log。請給我 crontab 要加的那一行,並逐欄解釋每個部分的意思。

拿到答案後,先把時間設成「兩分鐘後」測試一次,確認真的有跑、紀錄檔真的有寫入,再改回正式的時間。

行動練習
  1. 把天氣腳本改成用 logging 寫入 weather.log,並用 Path(__file__) 組出路徑,手動執行確認。
  2. 依照你的作業系統,設定每天早上自動執行。
  3. 先把時間設成幾分鐘後,等它執行,打開 weather.log 確認多了一行。
  4. 加分題:把 Wi-Fi 關掉再手動執行一次,看看紀錄檔裡的 ERROR 長什麼樣子。這就是錯誤處理和紀錄檔的價值。

讀完了嗎?

標記完成後,單元與專案的進度會自動更新(只存在這台裝置的瀏覽器)。

卡住了?讓 AI 當你的家教複製這段提問範本,貼到 Claude 或其他 AI 工具,再補上你卡住的地方。

留言與討論

卡關了、有心得,或發現內容需要更新?都歡迎留言。留言使用 GitHub 帳號登入。

留言區即將開放。現在可以先到 GitHub 討論區 發問,或看看 交流頁 的其他管道。