Pythonでコードが書けるようになると、次にやってみたくなるのが自動化です。
毎朝ファイルを整理したい。毎日決まった時間にデータを取得したい。週に1回だけレポートを作りたい。
こうした処理を毎回手で実行するのは、もったいないですよね。
そこで役に立つのが定期実行です。Pythonのプログラムを、決まった時間や曜日に自動で動かせるようになると、学習した知識が一気に実用的になります。
この記事では、IT初心者やPython学習者向けに、cronとタスクスケジューラの基本をやさしく解説します。
Pythonの定期実行とは何か¶
Pythonの定期実行とは、Pythonファイルを決まったタイミングで自動的に実行することです。
たとえば、毎日9時に report.py を動かす、毎週月曜日に backup.py を動かす、1時間ごとに check_status.py を動かす、といった使い方があります。
手動で実行する場合は、ターミナルやコマンドプロンプトで次のように入力します。
python report.py
定期実行では、この操作を人間の代わりにOSへ任せます。
つまり、Pythonが特別な予約機能を持っているというより、OS側のスケジュール機能を使ってPythonを呼び出すイメージです。
なぜ定期実行を学ぶと便利なのか¶
Pythonは自動化と相性がいい言語です。
ファイル整理、Excel処理、Web APIからのデータ取得、通知Bot、バックアップ、ログ集計など、毎回同じ手順で行う作業をPythonに任せられます。
ただし、Pythonスクリプトを作っただけでは、実行する人が必要です。そこで定期実行を組み合わせると、本当の意味で自動化に近づきます。
私の感覚でも、実務で価値が出やすいのは難しいアルゴリズムよりも、こうした小さな自動化です。
毎日5分かかる作業でも、1年続けばかなりの時間になります。しかも、人間がやるよりミスも減らせます。
cronとタスクスケジューラの違い¶
定期実行の方法は、使っているOSによって変わります。
LinuxやMacではcronがよく使われます。Windowsではタスクスケジューラが標準機能として用意されています。
どちらも目的は同じです。決めたタイミングでコマンドやプログラムを実行します。
違いをざっくり整理すると、次のようになります。
| 項目 | cron | タスクスケジューラ |
|---|---|---|
| 主なOS | Linux、Mac | Windows |
| 設定方法 | crontabにコマンドを書く | 画面操作でタスクを作成する |
| 向いている人 | サーバーやLinuxを使う人 | Windows PCで作業する人 |
| 学習のポイント | cron式の読み方 | 実行プログラムと引数の設定 |
| よくある用途 | サーバー上の定期処理 | ローカルPCの業務自動化 |
初心者のうちは、自分の環境に合わせて片方だけ覚えれば大丈夫です。
Windowsならタスクスケジューラから始める。LinuxやMac、サーバーに興味があるならcronから始める。この理解で十分です。
Linuxの基本操作に不安がある方は、以下の記事も参考にしてください。
【関連記事】Python初学者向け Linuxで覚えておきたい基本コマンド完全ガイド
まずは定期実行したいPythonファイルを用意する¶
cronやタスクスケジューラを触る前に、まずは普通に実行できるPythonファイルを用意しましょう。
定期実行でつまずく人の多くは、スケジュール設定以前に、Pythonファイル単体が正しく動くか確認できていません。
ここでは、現在時刻をログファイルに追記する簡単なスクリプトを作ります。
from datetime import datetime
from pathlib import Path
log_path = Path(__file__).parent / "run.log"
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
with log_path.open("a", encoding="utf-8") as file:
file.write(f"{now} に実行されました\n")
このファイルを sample_job.py という名前で保存します。
まずは手動で実行してみましょう。
python sample_job.py
実行後に run.log というファイルが作られ、実行時刻が書き込まれていれば成功です。
このように、最初は画面に表示するだけでなく、ファイルに結果を残す形にしておくと確認しやすくなります。
cronの基本¶
ここからは、LinuxやMacでよく使われるcronについて見ていきます。
cronは、決められたスケジュールに従ってコマンドを実行する仕組みです。サーバー上で毎日処理を動かしたいときにもよく使われます。
crontabとは何か¶
cronの設定は、crontabという場所に書きます。
ターミナルで次のコマンドを実行すると、現在のユーザー用のcron設定を編集できます。
crontab -e
初めて実行すると、エディタの選択を求められることがあります。初心者のうちは、画面の案内に従って選べば大丈夫です。
crontabには、実行タイミングと実行したいコマンドを書きます。
たとえば、毎日9時にPythonファイルを実行したい場合は、次のように書きます。
0 9 * * * /usr/bin/python3 /home/user/sample_job.py
これは、毎日9時0分に /home/user/sample_job.py を実行するという意味です。
最初は暗号のように見えるかもしれません。でも、分解するとそれほど難しくありません。
cron式の読み方¶
cronの時間指定は、5つの項目で表します。
左から順に、分、時、日、月、曜日です。
| 位置 | 意味 | 例 |
|---|---|---|
| 1番目 | 分 | 0なら0分 |
| 2番目 | 時 | 9なら9時 |
| 3番目 | 日 | 1なら毎月1日 |
| 4番目 | 月 | 6なら6月 |
| 5番目 | 曜日 | 1なら月曜日 |
たとえば、次のような指定があります。
0 9 * * * command
これは毎日9時0分に実行です。
*/30 * * * * command
これは30分ごとに実行です。
0 8 * * 1 command
これは毎週月曜日の8時0分に実行です。
* はすべてという意味です。毎日や毎月のように、条件を限定しないときに使います。
cronでPythonを実行する例¶
実際にPythonをcronで動かす場合は、Pythonコマンドとファイルの場所をできるだけ絶対パスで書くのがおすすめです。
たとえば、次のように書きます。
0 9 * * * /usr/bin/python3 /home/user/jobs/sample_job.py
/usr/bin/python3 はPythonの場所です。
Pythonの場所は、次のコマンドで確認できます。
which python3
Pythonファイルの場所も、相対パスではなく絶対パスで書くとトラブルが減ります。
cronは普段自分が操作しているターミナルと環境が少し違うため、相対パスや環境変数が原因で動かないことがあります。
これは経験者でもよく引っかかるポイントです。
cronでログを残す¶
cronで実行した処理が失敗したとき、何も記録がないと原因を調べるのが大変です。
そのため、標準出力やエラー出力をログファイルに保存しておくと安心です。
0 9 * * * /usr/bin/python3 /home/user/jobs/sample_job.py >> /home/user/jobs/cron.log 2>&1
>> は出力をファイルに追記する指定です。
2>&1 はエラー出力も同じファイルにまとめる指定です。最初は意味が難しく感じるかもしれませんが、ログを残すためのおまじないとして覚えても大丈夫です。
ただ、実務ではこのログがとても重要です。
動いていない原因を調べるとき、ログがあるかないかで解決までの時間が大きく変わります。
ログの基本を知りたい方は、以下の記事も参考になります。
【関連記事】Pythonのロギング(logging)入門。print卒業!プロが使うログ出力の正しい作法
Windowsタスクスケジューラの基本¶
次に、WindowsでPythonを定期実行する方法を見ていきます。
Windowsには、タスクスケジューラという標準機能があります。画面操作で設定できるため、cronより直感的に感じる人も多いです。
タスクスケジューラで設定する内容¶
タスクスケジューラで大事なのは、何をいつ実行するかです。
いつ実行するかは、毎日、毎週、ログオン時、PC起動時などから選べます。
何を実行するかでは、Python本体とPythonファイルを指定します。
ここで初心者がよく迷うのは、プログラムの場所と引数の分け方です。
たとえば、Pythonファイルを実行したい場合、プログラムにはPython本体を指定します。引数には実行したいPythonファイルを指定します。
| 設定項目 | 入力例 | 意味 |
|---|---|---|
| プログラム | C:\Users\user\AppData\Local\Programs\Python\Python312\python.exe |
Python本体 |
| 引数 | C:\Users\user\jobs\sample_job.py |
実行したいPythonファイル |
| 開始場所 | C:\Users\user\jobs |
作業フォルダ |
この3つを正しく分けることが大切です。
特に開始場所を空にすると、ファイル出力の場所が想定と違ったり、相対パスがうまく動かなかったりします。
Python本体の場所を確認する¶
Python本体の場所がわからない場合は、コマンドプロンプトで次のコマンドを実行します。
where python
すると、Pythonの実行ファイルの場所が表示されます。
表示されたパスを、タスクスケジューラのプログラムに指定します。
複数表示されることもあります。その場合は、普段使っているPython環境と同じものか確認しましょう。
仮想環境を使っている場合は、仮想環境内の python.exe を指定するケースもあります。
タスクスケジューラで実行する流れ¶
画面操作の細かい名前はWindowsのバージョンによって少し変わりますが、基本的な流れは同じです。
タスクスケジューラを開き、基本タスクの作成を選びます。タスク名を入力し、毎日や毎週などの実行タイミングを選びます。
次に、操作としてプログラムの開始を選びます。
そこでPython本体、引数、開始場所を設定します。
最後に保存して、右クリックから実行を選んで手動テストします。ここで run.log が更新されれば、タスクスケジューラからPythonが実行できています。
いきなり翌日の実行を待つ必要はありません。まずは手動実行で確認するのが大切です。
定期実行でよくある失敗¶
定期実行は、最初の成功まで少しつまずきやすい分野です。
でも、よくある失敗パターンを知っておくと、かなり落ち着いて対応できます。
手動では動くのに定期実行では動かない¶
一番多いのがこれです。
ターミナルでは動くのに、cronやタスクスケジューラでは動かない。初心者のころは意味がわからないと思います。
原因として多いのは、作業フォルダが違う、Pythonの場所が違う、必要なライブラリが入っていない、環境変数が読み込まれていない、というものです。
この場合は、まず絶対パスに変えてみましょう。
Python本体のパス、Pythonファイルのパス、ログファイルのパスを明示すると、問題がかなり切り分けやすくなります。
ライブラリが見つからない¶
定期実行で ModuleNotFoundError が出ることもよくあります。
これは、手動で使っているPython環境と、定期実行で使っているPython環境が違うときに起きやすいです。
たとえば、普段は仮想環境のPythonを使っているのに、cronやタスクスケジューラでは別のPythonを呼んでいる場合です。
この場合は、使いたいPythonのパスを正しく指定しましょう。
仮想環境を使っているなら、仮想環境内のPythonを直接指定する方法もあります。
0 9 * * * /home/user/project/.venv/bin/python /home/user/project/sample_job.py
Windowsでも、仮想環境内の python.exe を指定できます。
実行結果がどこにも見えない¶
定期実行は、画面を開いて実行されるとは限りません。
そのため、printで出力しても画面に見えないことがあります。初心者はここで動いていないと勘違いしがちです。
定期実行では、ログファイルに結果を残す習慣をつけましょう。
Python側でファイルに書き込む方法でもよいですし、cron側でログにリダイレクトする方法でもよいです。
大事なのは、後から確認できる証拠を残すことです。
実務で意識したい定期実行の考え方¶
ここからは、少し実務寄りの話です。
定期実行は、動けば終わりではありません。むしろ、動き続ける処理だからこそ、失敗したときのことを考えておく必要があります。
小さく始めて、少しずつ育てる¶
最初から完璧な自動化を作ろうとすると、途中で苦しくなります。
まずは、1日1回ログを書くだけのスクリプトで十分です。次にファイルを読み込む。次にAPIを呼ぶ。次に通知する。
このように小さく育てると、どこで壊れたのかがわかりやすくなります。
エンジニア歴10年の経験上、定期実行で怖いのは複雑な処理そのものより、失敗に気づけないことです。
だからこそ、最初からログや通知を少しだけ入れておくと安心です。
引数で処理を変えられるようにする¶
定期実行のPythonスクリプトは、引数で動作を変えられるようにすると便利です。
たとえば、通常実行とテスト実行を切り替えたり、処理対象の日付を指定したりできます。
import argparse
from datetime import date
parser = argparse.ArgumentParser()
parser.add_argument("--target-date", default=str(date.today()))
args = parser.parse_args()
print(f"{args.target_date} の処理を実行します")
このようにしておくと、cronでは次のように実行できます。
0 9 * * * /usr/bin/python3 /home/user/jobs/report.py --target-date 2026-06-14
毎回コードを書き換えなくてよくなるので、保守しやすくなります。
コマンドライン引数の扱いを学びたい方は、以下の記事もご覧ください。
【関連記事】Pythonでコマンドラインツールを作るには?argparse入門
失敗したときの通知を考える¶
定期実行は、失敗しても自分が見ていないことがあります。
たとえば、毎朝の集計処理が失敗していたのに、数日後まで気づかないということもあります。実務ではかなり困ります。
最初はログだけでもよいですが、慣れてきたらメールやチャット通知を入れると安心です。
特に、毎日動く処理や業務に関係する処理では、失敗に気づける仕組みが大切です。
cronをやってみよう!¶
定期実行は、実際に手を動かすと一気に理解が進みます。
難しいものから始める必要はありません。自分の生活や学習に関係する小さな処理がおすすめです。
たとえば、毎日学習ログを作る、ダウンロードフォルダのファイル数を記録する、天気APIから情報を取得する、CSVを集計する、バックアップファイルを作る、といったテーマです。
最初のゴールは、すごいアプリを作ることではありません。
決まった時間にPythonが動いたと確認できることです。大きな一歩です。
慣れてきたら、定期実行した結果をログに残し、さらに通知までつなげてみましょう。
まとめ¶
Pythonで定期実行するには、OSのスケジュール機能を使います。
LinuxやMacではcron、Windowsではタスクスケジューラを使うのが基本です。どちらも、決まった時間にPythonを呼び出すための仕組みです。
初心者がまず意識したいのは、Pythonファイル単体で正しく動くか確認することです。そのうえで、Python本体のパス、スクリプトのパス、作業フォルダ、ログの保存先を丁寧に設定しましょう。
手動では動くのに定期実行では動かない場合、環境やパスの違いが原因であることが多いです。
これは初心者だけの問題ではありません。エンジニア歴10年の私でも、定期実行のトラブルではまずログとパスを確認します。
定期実行を覚えると、Python学習はかなり実用に近づきます。
毎日の小さな作業を自動化できるようになると、Pythonを書いていてよかったと感じる場面が増えるはずです。
まずは、現在時刻をログに書くだけの小さなスクリプトから始めてみてください。
ここまでお読みいただきありがとうございました。