概要(「決まった時間にPythonを勝手に動かす」仕組み)
cron(Linux / Mac)やタスクスケジューラ(Windows)は、
「毎朝9時にこのPythonスクリプトを実行して」「1時間ごとに定期処理して」といった自動実行を担当する“タイマー”です。
Python側は「やりたい処理を書いた .py ファイル」を用意するだけ。
あとは OS の仕組みに「いつ・どのコマンドを実行するか」を登録します。
重要なのは、
- どの Python を使うか(パス・仮想環境)
- 作業フォルダとファイルパス(絶対パスで書く)
- ログ(成功・失敗が分かる出力先)
ここをちゃんと設計しておくことです。
まずは前提:自動化したい Python スクリプトを用意する
シンプルな例:ログファイルに「今の時間」を書き込むスクリプト
とりあえず「動いたかどうかが分かりやすい」サンプルから。
# save as: /path/to/scripts/hello_cron.py
from datetime import datetime
from pathlib import Path
def main():
base = Path("/path/to/scripts") # 自分の好きな場所に
log_file = base / "hello_cron.log"
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with log_file.open("a", encoding="utf-8") as f:
f.write(f"[{now}] Hello from cron / Task Scheduler!\n")
if __name__ == "__main__":
main()
Pythonこのスクリプトは、実行されるたびに hello_cron.log に1行追加します。
つまり、cron やタスクスケジューラから実行されるかどうかを、
ログファイルを見れば一発で確認できます。
ここで意識してほしいのは「絶対パス」を使うことです。
相対パスだと、実行される“場所(カレントディレクトリ)”が
cron / タスクスケジューラ側の設定に依存してしまい、事故りやすくなります。
Linux / Mac:cron で Python スクリプトを定期実行する
どの Python を使うか確認する
ターミナルで次を打って、Python のフルパスを確認します。
which python3
例えば /usr/bin/python3 や /home/you/.pyenv/versions/.../bin/python などが出ます。
仮想環境を使っているなら、その bin/python を使うのが良いです。
cron の基本構文を理解する
cron の設定ファイルは「いつ・何を実行するか」を1行で書きます。
形式はこうです。
分 時 日 月 曜日 コマンド
毎日9:00に実行なら、
0 9 * * * コマンド
という感じ。
crontab を編集して登録する
ターミナルで次を実行します。
crontab -e
Python初めてならエディタの選択になることがあります。
開いたファイルの一番下に、例えばこんな行を追加します。
0 9 * * * /usr/bin/python3 /path/to/scripts/hello_cron.py >> /path/to/scripts/cron_stdout.log 2>&1
ここで大事なポイントがいくつかあります。
一つ目は「Python のパスとスクリプトのパスを両方、絶対パスで書く」こと。
ホームディレクトリの ~ も、cron の中では展開されないことがあるので、/home/yourname/... のように正確に書きます。
二つ目は「標準出力と標準エラーをログファイルへリダイレクトしている」こと。>> は追記、 2>&1 はエラーを stdout と同じところへ送る、という意味です。
これで cron は「毎日9:00にこの行を実行する」ようになります。
ちゃんと動いているか確認する
設定後にしばらく待ち、次の3つを確認します。
一つ目は hello_cron.log に新しい行が増えているか。
二つ目は cron_stdout.log にエラーが出ていないか。
三つ目は crontab -l で設定がちゃんと入っているか。
ここまでで動いていれば、あとは hello_cron.py を
「本当にやりたい処理」に差し替えていくだけです。
Windows:タスクスケジューラで Python スクリプトを定期実行する
スクリプトと Python のパスを確認する
例として、
- スクリプト:
C:\scripts\hello_scheduler.py - Python:
C:\Users\あなたのユーザー名\AppData\Local\Programs\Python\Python311\python.exe
とします。
仮想環境を使っているなら、venv\Scripts\python.exe のフルパスを使うとよいです。
タスクスケジューラで新しいタスクを作る流れ
スタートメニューから「タスクスケジューラ」を開きます。
大まかな流れはこうです。
「タスクの作成」を選ぶ → 「全般」タブでタスク名を付ける → 「トリガー」タブで実行タイミングを設定 → 「操作」タブで実行するプログラムと引数を設定。
具体的に説明します。
「タスクの作成」をクリックし、「全般」タブで
名前に「HelloPython」など分かりやすい名前を付けます。
次に「トリガー」タブで「新規」を押し、
「タスクの開始」で「スケジュールに従う」を選び、
「毎日」「開始時刻 09:00」などを指定します。
次に「操作」タブで「新規」を押します。
「操作」は「プログラムの開始」を選択。
「プログラム/スクリプト」に Python のフルパスを入れます。
C:\Users\あなたのユーザー名\AppData\Local\Programs\Python\Python311\python.exe
「引数の追加(オプション)」には、
スクリプトのフルパスを入れます。
C:\scripts\hello_scheduler.py
「開始(オプション)」には、
スクリプトのあるフォルダのパスを入れておくと安心です。
C:\scripts
これで「指定したPythonで、指定したスクリプトを、そのフォルダをカレントディレクトリとして実行する」
という設定になります。
動作確認とログの考え方
簡単なのは、スクリプト側でログファイルを書くことです。
さっきの hello_cron.py と同じように、hello_scheduler.log に1行追記する処理を入れておけば、
翌朝ログを見て「動いたかどうか」が一目で分かります。
動かないときは、
- 「履歴」を有効にして、タスクの履歴や最後の実行結果を見る
- Python のパス、スクリプトのパスが正しいか確認する
- 権限(ユーザーアカウント)や「ユーザーがログオンしているかどうかにかかわらず実行する」設定を確認する
あたりを順にチェックしていきます。
重要ポイントの深掘り:本番運用でハマりやすいところ
相対パスを使わない(必ず絶対パス)
cron やタスクスケジューラから実行されるとき、
「現在のフォルダ」はあなたがターミナルや PowerShell で作業している場所とは違います。
open("data.csv") のように相対パスで書いてあると、
cron実行時には「知らない場所を探しに行く」ことになり、
ファイルが見つからない、というミスが簡単に起きます。
なので、スクリプト内のファイル操作は、
Path を使って絶対パスで書くのが安全です。
from pathlib import Path
BASE_DIR = Path("/path/to/project")
csv_file = BASE_DIR / "data" / "input.csv"
PythonWindows なら、
BASE_DIR = Path(r"C:\scripts\project")
Pythonのように r"..." で書いておくと、バックスラッシュのエスケープを気にせずに済みます。
仮想環境の Python を指定する
ライブラリ(pandas, openpyxl, requests など)を venv に入れているなら、
cron / タスクスケジューラには「その venv の Python」を指定します。
例えば /home/you/venv/myproj/bin/python やC:\project\venv\Scripts\python.exe のような感じです。
スクリプト側で source venv/bin/activate のようなことをやろうとすると、
cronからはうまく働かないことが多いので、
「最初から仮想環境の python を実行する」のがシンプルで確実です。
環境変数(PATH、LANG など)の違い
cron の中は「あなたがログインしているシェル」と環境が違います。
PATH や LANG などが最小限になっているので、
手動では動くのに cron では失敗、という現象が起きがちです。
本当に必要なものは、スクリプト内か、
cron の行の中で明示的に指定してしまうと安心です。
簡単には、
import os
print(os.environ, file=log_file)
Pythonのようなログを一度出してみて、「cronから見えている環境」を知っておくのも手です。
実用的な組み合わせ例:毎朝9時にExcelを自動集計して保存する
最後に、ここまでの要素を組み合わせた現実的なイメージをざっくり描いてみます。
一つ目に、/home/you/project/auto_report.py のようなスクリプトを作る。
この中で、
- 昨日までのExcelを集めて集計(pandas)
- グラフやピボットを作る
- 結果を Excel や PDF に保存
- ログに「成功」「件数」「処理時間」を書く
までをやる。
二つ目に、そのスクリプトを venv の Python で実行する cron を設定する。
0 9 * * * /home/you/project/venv/bin/python /home/you/project/auto_report.py >> /home/you/project/logs/auto_report.log 2>&1
これで、「毎朝9時にレポートが自動生成される」という状態になります。
Windows でも考え方は全く同じで、タスクスケジューラに置き換えるだけです。
まとめ(「スクリプトを作る → どのPythonで動かすか決める → OSのタイマーに登録する」)
cron やタスクスケジューラは、
Python 自体を難しくするものではなく、
- いつ実行するか
- どの Python で
- どのスクリプトを
- どのフォルダで
- ログをどこに吐くか
を OS に「予約する」仕組みです。
スクリプトは普通に書く。
パスは絶対パスにする。
仮想環境の Python を指定する。
ログをきちんと出して、後から確認できるようにする。
この型さえ押さえれば、
「毎日自動で動いて、気づいたら結果だけがフォルダにある」という世界を、
Python 初心者でも十分に作れます。
