Pythonスクリプトを毎日決まった時刻に自動実行!タスクスケジューラ・cronの設定と動かないときの対処
「毎朝同じPythonスクリプトを手で実行してるんですけど、これ自動にできないんですか?」
集計やバックアップ、Webサイトのチェックなど、毎日決まった時間にやりたい処理ってありますよね。せっかくPythonで自動化したのに、実行ボタンを押すのは自分…というのはもったいないです😅
今回は、Pythonスクリプトを毎日決まった時刻に自動実行する方法を解説します。Windowsはタスクスケジューラ、Mac・Linuxはcron(クーロン)を使います。どちらもOSに最初から入っている機能なので、追加のインストールは不要です。
対象はPythonスクリプトを自分で実行したことがある初心者〜初級者の方。実は「登録したのに動かない」原因のほとんどは、スケジューラの設定ではなくスクリプト側の書き方にあります。そこから一緒に見ていきましょう!
まず知っておきたい落とし穴:「実行フォルダ」が変わる

手で実行するときは、たいていスクリプトがあるフォルダで 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が毎日勝手に働いてくれます。ぜひ、いつも手で実行しているスクリプトから試してみてください🚀
こちらも読まれています
📚 関連商品・おすすめ書籍
※本記事にはアフィリエイトリンクが含まれます。





