「毎朝同じPythonスクリプトを手で実行してるんですけど、これ自動にできないんですか?」

集計やバックアップ、Webサイトのチェックなど、毎日決まった時間にやりたい処理ってありますよね。せっかくPythonで自動化したのに、実行ボタンを押すのは自分…というのはもったいないです😅

今回は、Pythonスクリプトを毎日決まった時刻に自動実行する方法を解説します。Windowsはタスクスケジューラ、Mac・Linuxはcron(クーロン)を使います。どちらもOSに最初から入っている機能なので、追加のインストールは不要です。

対象はPythonスクリプトを自分で実行したことがある初心者〜初級者の方。実は「登録したのに動かない」原因のほとんどは、スケジューラの設定ではなくスクリプト側の書き方にあります。そこから一緒に見ていきましょう!

まず知っておきたい落とし穴:「実行フォルダ」が変わる

alarm clock desk morning
alarm clock desk morning / Photo by Enikő Tóth via Pexels

手で実行するときは、たいていスクリプトがあるフォルダで python report.py と打ちますよね。ところが、タスクスケジューラやcronから起動されると、「今いるフォルダ(カレントディレクトリ)」が別の場所になります。

イメージとしては「いつもの机ではなく、知らない部屋で作業を始めさせられる」感じです。すると、相対パスで書いたファイルが見つからない・別の場所に作られるという問題が起きます。

次のスクリプトで試してみましょう。

from datetime import datetime

# ❌ 相対パス:「実行したときのフォルダ」に作られてしまう
with open("report_log.txt", "a", encoding="utf-8") as f:
    f.write(f"{datetime.now():%Y-%m-%d %H:%M:%S} レポートを作成しました\n")

print("書き込みました")
実行するフォルダでファイルの場所が変わる
実行するフォルダでファイルの場所が変わる

このスクリプトを、同じフォルダで実行した場合と、別のフォルダから実行した場合で比べると…

  • 同じフォルダで実行 → スクリプトの横に report_log.txt ができる
  • 別のフォルダから実行 → 実行したフォルダの方に report_log.txt ができる

エラーにならないのがやっかいなところで、「動いているはずなのにログが増えない…」と悩む原因になります。Windowsのタスクスケジューラでは、開始フォルダを指定しないと C:\Windows\System32 で起動されることが多く、ファイルが見当たらない・書き込めないといったことが起きがちです。

自動実行に強いスクリプトの書き方

ポイントは、ファイルの場所を「スクリプトが置いてあるフォルダ」基準で決めることです。あわせて、誰も見ていない時間に動くので、結果や失敗をログファイルに残すようにしておきます。

import logging
from datetime import datetime
from pathlib import Path

# ✅ このスクリプトが置いてあるフォルダを基準にする
BASE_DIR = Path(__file__).resolve().parent
LOG_FILE = BASE_DIR / "daily_report.log"

logging.basicConfig(
    filename=LOG_FILE,
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    encoding="utf-8",
)


def make_report() -> str:
    """ここに毎日やりたい処理を書く(今回は例として日付入りのメモを作る)"""
    today = datetime.now().strftime("%Y-%m-%d")
    out = BASE_DIR / "reports" / f"report_{today}.txt"
    out.parent.mkdir(exist_ok=True)
    out.write_text(f"{today} の日次レポート\n", encoding="utf-8")
    return out.name


try:
    name = make_report()
    logging.info("レポート作成: %s", name)
except Exception:
    # 無人で動くので、失敗したら内容をログに残す
    logging.exception("レポート作成に失敗しました")
    raise
修正版のログ(別のフォルダから実行)
修正版のログ(別のフォルダから実行)

ポイントをまとめるとこんな感じです。

  • Path(__file__).resolve().parent でスクリプト自身のフォルダを取得し、すべてのファイルをそこからの相対位置で指定する
  • logging でログファイルに時刻つきで記録(print() は自動実行だと誰も見られない)
  • logging.exception() なら、エラーの詳細(どの行で何が起きたか)までログに残る
  • 最後に raise し直して、スケジューラ側にも「失敗した」と伝わるようにしている

この修正版を別のフォルダから実行しても、ログとレポートは必ずスクリプトの横の daily_report.log と reports フォルダに作られます。「どこから実行されても同じ結果になる」ことを、手で確認してから次に進みましょう。

Windows:タスクスケジューラで毎日9時に実行する

タスクスケジューラは画面から設定することもできますが、コマンド1つで登録できる schtasks を使うと手順を再現しやすいです。コマンドプロンプトで次のように実行します。

:: 使っている python.exe の場所を調べる(表示された1行目をメモ)
where python

:: 毎日 9:00 に daily_report.py を実行するタスクを登録(/F は同名タスクがあれば上書き)
schtasks /Create /TN "DailyReport" /SC DAILY /ST 09:00 /F ^
  /TR "\"C:\Users\you\AppData\Local\Programs\Python\Python313\python.exe\" \"C:\work\daily_report.py\""

:: 登録内容の確認・今すぐ試しに実行・削除
schtasks /Query /TN "DailyReport"
schtasks /Run /TN "DailyReport"
schtasks /Delete /TN "DailyReport" /F

ここが重要です👇

  • /TR には、python.exe とスクリプトの両方をフルパスで書く(python だけだと見つからないことがある)
  • パスにスペースが含まれるときは、\"...\" のようにダブルクォートで囲む
  • /ST 09:00 は24時間表記。/SC DAILY で毎日になる
  • 登録したら schtasks /Run ですぐに1回動かして、ログが書かれるか確認する

実行中に黒いコンソール画面が一瞬出るのが気になる場合は、python.exe の代わりに同じフォルダにある pythonw.exe(画面を出さないPython)を指定する方法もあります。

画面から設定するときのチェックポイント

  • 「操作」タブの「開始(オプション)」にスクリプトのフォルダを入れておくと、相対パスの事故を防げる(ただし、今回のようにスクリプト側で対策しておくのが確実)
  • ノートPCの場合、「条件」タブの「AC電源で使用している場合のみタスクを開始する」がオンだと、バッテリー駆動中は動かない
  • 「設定」タブの「スケジュールされた開始時刻にタスクを開始できなかった場合、すぐにタスクを実行する」をオンにすると、9時に電源が入っていなかった日も起動後に実行してくれる

Mac・Linux:cronで毎日9時に実行する

Mac・Linuxでは、ターミナルで crontab -e を実行し、開いたファイルに1行追加します。

# crontab -e で開いたファイルに1行追加する(分 時 日 月 曜日 コマンド)
0 9 * * * /usr/bin/python3 /home/you/work/daily_report.py >> /home/you/work/cron.log 2>&1
  • 先頭の 0 9 * * * が「毎日 9時0分」という意味(左から 分・時・日・月・曜日)
  • cronは使えるコマンドの検索範囲(PATH)が狭いので、python3 もスクリプトもフルパスで書く(which python3 で場所を確認できる)
  • >> cron.log 2>&1 で、画面に出るはずだった出力やエラーもファイルに残せる
  • 登録内容は crontab -l で確認できる

macOSでは、cronから書類フォルダなどにアクセスする場合、セキュリティ設定(フルディスクアクセス)の許可が必要になることがあります。うまく動かないときはまず cron.log を確認しましょう。

動かないときのチェックリスト

  • ログファイルが作られていない → そもそも起動していない。Windowsはタスクスケジューラの「前回の実行結果」、Mac・Linuxは cron.log を確認
  • ログはあるがエラーが出ている → 手で実行したときとの違い(カレントフォルダ・環境変数・仮想環境)を疑う
  • 仮想環境(venv)のライブラリが見つからない → /TR やcronには、仮想環境の中の python(例: venv\Scripts\python.exe、venv/bin/python)をフルパスで指定する
  • PCがスリープ・電源オフだった → cronもタスクスケジューラも、その時刻に動いていないPCでは実行されない(Windowsは上の「すぐにタスクを実行する」設定で後から実行できる)

まとめ

Pythonスクリプトの定期実行は、OSの機能だけで意外と簡単に実現できます。今回のポイントは3つです。

  • 自動実行ではカレントフォルダが変わる。ファイルは Path(__file__).resolve().parent 基準で指定する
  • 誰も見ていないので、結果とエラーはログファイルに残す
  • 登録するときは python とスクリプトをフルパスで書き、登録直後に1回動かして確認する

一度仕組みを作ってしまえば、あとはPCが毎日勝手に働いてくれます。ぜひ、いつも手で実行しているスクリプトから試してみてください🚀

📚 関連商品・おすすめ書籍

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

もしも

スッキリわかるPython入門 第2版 (スッキリわかる入門シリーズ)

初心者に定番のPython入門書

Amazonで見る
実践Claude Code入門―現場で活用するためのAIコーディングの思考法

もしも

実践Claude Code入門―現場で活用するためのAIコーディングの思考法

AIコーディングの現場活用法を学ぶ一冊

Amazonで見る
Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

もしも

Python Web開発実践入門 ―― FastAPIによるWebAPI開発と非同期処理

FastAPIでWebAPI開発を実践的に学ぶ

Amazonで見る

※本記事にはアフィリエイトリンクが含まれます。

ABOUT ME
やまちゃん
これまで学生と社会人を合わせて5000人以上にプログラミング学習を指導。 ゼロからイチをわかりやすく解説する専門家として活動しており、本業ではArduinoを用いたIoT開発とロボットプログラミングが専門。 Pythonを用いたアプリ開発、ウェブアプリケーションの開発で業務の効率化をサポートしています。