Windows タスクスケジューラで Python スクリプトを自動実行する方法

目的と関連ワード
Python スクリプトを定期実行して手作業を減らす方法を示します。
- 関連ワード: Python スクリプト スケジュール, Windows タスクスケジューラ, バッチファイル 自動実行, virtualenv スケジュール, ログ出力
概要と準備
タスクスケジューラは Windows に標準で備わるツールです。これを使うと、毎日・毎週・一度限りなど任意のトリガーで Python スクリプトを起動できます。事前に確認しておくべき点:
- Python 実行ファイルのパス(where python で確認)
- スクリプトの絶対パス
- 実行に必要な環境変数や仮想環境
- 管理者権限が必要かどうか
重要: スクリプトが外部リソース(ネットワークドライブ、共有フォルダ、API)に依存する場合は、その接続がスケジュール時にも利用可能か確認してください。
タスクスケジューラから直接スクリプトをスケジュールする手順
- Win + R を押して「taskschd.msc」と入力し Enter を押してタスクスケジューラを開きます。
- 「操作」タブに移動し、「基本タスクの作成…」をクリックします。
- タスクの名前と説明を入力して「次へ」。わかりやすい名前を付けます(例: Daily Data Export)。
- 実行頻度(毎日、毎週、1回など)を選択して「次へ」。
- 必要なら開始日と時刻を設定します。次に「操作」で「プログラムの開始」を選びます。
- “Program/script” フィールドには Python 実行ファイルのパスを入力し、”Add arguments” フィールドにスクリプトのフルパスを入れます。また、”Start in”(作業ディレクトリ)をスクリプトのディレクトリにしておくと相対パス問題を避けられます。
例:
- Program/script: C:\Python39\python.exe
- Add arguments: “C:\projects\scripts\daily_report.py”
- Start in: C:\projects\scripts
- 設定を確認して「完了」をクリックします。
これで指定したスケジュールで Python スクリプトが起動します。
バッチファイル経由で実行する別の方法
直接指定する代わりにバッチファイル(.bat)を作ると、以下の利点があります:
- 仮想環境のアクティベートや複数コマンドの実行が可能
- ログのリダイレクトやエラーハンドリングをまとめられる
メモ帳に以下を貼り付けて保存し、拡張子を .bat にします。
@echo off
REM 仮想環境を使う例
call "C:\projects\venv\Scripts\activate.bat"
REM Python をフルパスで呼び出す(必要に応じて -u を付けるとバッファリングを抑制)
"C:\projects\venv\Scripts\python.exe" "C:\projects\scripts\daily_report.py" >> "C:\projects\logs\daily_report.log" 2>&1
REM 終了コードを返してログを残す
exit /b %ERRORLEVEL%
ポイント:
- パスにスペースがある場合は必ず二重引用符で囲んでください。
- 標準出力と標準エラーをファイルにリダイレクトするとデバッグが容易になります。
-u
を Python に渡すと標準出力がアンバッファ化され、ログがリアルタイムに出力されます。
バッチファイルを作ったら、タスクスケジューラでは Program/script にバッチファイルのフルパスを指定します。
Program/script: C:\projects\scripts\run_daily_report.bat
Add arguments:
Start in: C:\projects\scripts
タスクの実行を確実にする設定
タスクのプロパティを開き、以下を確認/変更します。
- 「全般」タブ: 「ユーザーがログオンしているかどうかにかかわらず実行する」を選択。バックグラウンド実行に必要です。
- 管理者権限が必要なら「最上位の特権で実行する」をチェックします。
- 「条件」タブ: ノートPCで AC 電源専用になっていると動作しません。「コンピューターが AC 電源に接続されている場合のみタスクを開始する」のチェックを外すことを検討してください。
- 「設定」タブ: 失敗時の再試行や最大実行時間を設定できます。
最後に「OK」を押し、必要に応じてパスワードを入力して設定を保存します。
実行の確認とログの確認
タスクを手動で実行して動作を確認します。タスクを右クリックして「実行」を選びます。
スクリプトが出力するログやファイルを確認して、期待通りに動いているかの検証を行います。
よくある問題と対処法
- タスクは「実行」になるがスクリプトが動かない: 作業ディレクトリ(Start in)が正しいか確認。相対パスでファイルを参照していると失敗しやすい。
- 権限エラー: 「最上位の特権で実行する」をオンにする、または管理者アカウントで実行する。
- ネットワークドライブが見つからない: タスクはサービスとして実行されるのでユーザーセッションのネットワークドライブはマウントされません。UNC パス(\server\share)を使うか、起動時にドライブをマップするコマンドをバッチに含める。
- 環境変数が見つからない: GUI で設定したユーザー環境変数はタスク実行時に反映されない場合があります。バッチで明示的に環境変数を設定するか、システム環境変数に追加する。
- 仮想環境の有効化が必要: バッチファイル内で activate.bat を呼ぶか、python.exe のフルパスを仮想環境配下に指定する。
実践的なヒントと改善案
- ログローテーション: 単純に追記するとファイルが肥大化します。日付付きファイル名を使うか、古いログを定期削除するタスクを追加しましょう。
- 再試行ポリシー: ネットワーク依存のスクリプトは失敗時に再試行する仕組みを入れておくと安定します。
- 監視: 重大な失敗はメールや Teams/Slack に通知するステップをバッチに入れるか、エラーレベルに応じた監視タスクを用意します。
代替アプローチ
- Windows サービスとしてデーモン化する(常駐処理が必要な場合)
- コンテナ化してスケジューラ(Kubernetes CronJob や Azure WebJob)で実行する
- サードパーティのジョブスケジューラ(例: Jenkins、Airflow)を利用する(複数依存やワークフロー管理が必要な場合)
役割別チェックリスト
- 開発者:
- スクリプトに絶対パスを使用しているか確認
- ログ出力を実装しているか
- エラーハンドリングと終了コードを返しているか
- システム管理者:
- ユーザー権限とポリシーを確認
- タスクの実行ユーザーのパスワードを管理
- ネットワーク/共有リソースのアクセス権を確認
- 運用担当:
- ログ監視ルールを設定
- 再試行と通知ルールを用意
受け入れ基準
- タスクを手動実行して期待する出力がログに残る
- スケジュール時間に自動実行される
- 失敗時に再試行または通知が行われる
- 長時間実行でもタイムアウトやリソース枯渇が発生しない
決定フロー(簡易)
flowchart TD
A[スクリプトは定期実行が必要か?] -->|いいえ| B[手動で実行]
A -->|はい| C[タスクスケジューラでスケジュール]
C --> D{依存関係ありか}
D -->|いいえ| E[直接またはバッチで実行]
D -->|はい| F[仮想環境・ネットワーク設定を含むバッチ]
F --> G[監視と通知を追加]
E --> G
小さな用語集
- タスクスケジューラ: Windows に標準搭載のジョブスケジューラ
- バッチファイル: Windows のコマンドをまとめた .bat ファイル
- virtualenv: Python の仮想環境
まとめ
Windows タスクスケジューラは、外部ツールを使わずに Python スクリプトを自動化する実用的な方法です。直接スクリプトを指定するか、バッチファイルで環境を整えてから実行するかは用途次第です。ログや作業ディレクトリ、権限の扱いをきちんと定義すれば、予期せぬ失敗を大幅に減らせます。
重要: 権限やネットワーク依存、仮想環境の扱いは必ず事前に検証してください。
著者
編集