記事内にはプロモーションが含まれています

Pythonでバッチ処理を実装!.batからの実行やおすすめフレームワーク

Pythonでバッチ処理を実装!.batからの実行やおすすめフレームワーク Python

業務効率化やデータ分析の現場において、Pythonを使った「バッチ処理」は非常に強力な武器となります。
定型業務を自動化したり、夜間に重たいデータを処理させたりと、活用の幅は無限大です。

しかし、「Pythonでバッチ処理」と言っても、具体的に何を指すのか迷うことはありませんか?

「Pythonスクリプト自体を自動で動かしたいのか」
「Windowsのバッチファイル(.bat)からPythonを呼び出したいのか」
「Pythonの中から他のコマンドを実行したいのか」

この記事では、Pythonにおけるバッチ処理の基本から、Windowsバッチファイルとの連携、subprocess モジュールの使い方、そして大規模開発にも耐えうるおすすめのフレームワークまで、実務で役立つノウハウを網羅的に解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はこじんまりとしたプログラミングスクールを運営
  • モットーは「利他の精神」

Pythonでバッチ処理を作る3つのパターン

Pythonでバッチ処理を実装すると言った場合、大きく分けて3つのアプローチがあります。

まずは自分がどのパターンを求めているのかを整理しましょう。

  1. Pythonスクリプト単体での自動化: Pythonだけで完結する処理(ファイル操作、スクレイピングなど)。
  2. バッチファイル(.bat)からPythonを実行: WindowsのタスクスケジューラなどでPythonを定期実行させるための手法。
  3. Pythonから外部コマンドを実行: Pythonを司令塔として、OSのコマンドや他のexeファイルを実行する手法。

それぞれの具体的な実装方法を見ていきましょう。

バッチファイル(.bat)からPythonスクリプトを実行する方法

Windows環境でPythonスクリプトを定期的に実行したり、ダブルクリック一発で起動させたりしたい場合、.bat ファイル(バッチファイル)を作成して連携させるのが一般的です。

ここでは、環境構築(パスや仮想環境)に左右されにくい、堅牢なバッチファイルの書き方を紹介します。

基本的なbatファイルの書き方

最もシンプルな方法は、python コマンドで対象のファイルを指定することです。

以下の例は、同じフォルダにある script.py を実行し、処理が終わっても画面がすぐに閉じないようにする設定です。

ファイル構成

  • run.bat
  • script.py

run.bat の中身

@echo off
cd /d %~dp0
python script.py
pause

このバッチファイルの各行が何を意味しているのか解説します。

  • @echo off: コマンド自体の表示(エコー)を消して、実行結果だけを見やすくするための定型句です。
  • cd /d %~dp0: これが非常に重要です。 バッチファイルがあるディレクトリ(フォルダ)をカレントディレクトリ(作業場所)に変更しています。これを記述しないと、ファイルの読み込みなどで「File Not Found」エラーが発生する原因になります。
  • python script.py: Pythonを呼び出して、スクリプトを実行します。
  • pause: 処理終了後に「続行するには何かキーを押してください…」と表示して一時停止します。これがないと、エラーが出ても一瞬で画面が閉じてしまい、原因が特定できません。

仮想環境(venv)を使用して実行する場合

プロジェクトごとにライブラリのバージョンを管理している場合、仮想環境(venv)のPythonを使って実行する必要があります。

一般的には activate.bat を呼び出しますが、環境変数の汚染などを防ぐため、仮想環境内のpython.exeを直接指定する方法が最もトラブルが少なく推奨されます。

@echo off
cd /d %~dp0
REM 仮想環境内のPythonをフルパス(相対パス)で指定して実行
.\venv\Scripts\python.exe script.py
pause

このように記述することで、わざわざ activate せずとも、その仮想環境にインストールされたライブラリを使ってスクリプトを実行できます。

引数を渡して実行する方法

バッチファイル実行時に引数(パラメータ)を渡し、Python側でそれを受け取ることも可能です。

run_args.bat

@echo off
cd /d %~dp0
python script.py "テストデータ" 100
pause

script.py (Python側)

import sys

# 引数の受け取り
args = sys.argv

# args[0]はスクリプトファイル名、args[1]以降が渡された引数
print(f"ファイル名: {args[0]}")

if len(args) > 1:
    print(f"第1引数: {args[1]}")
    print(f"第2引数: {args[2]}")

実行結果

ファイル名: script.py
第1引数: テストデータ
第2引数: 100

Python側では標準ライブラリの sys モジュールを使用します。

sys.argv はリストになっており、インデックス0にはスクリプト名が、インデックス1以降にバッチファイルから渡された引数が格納されます。

これにより、処理対象の日付やファイル名をバッチ側から動的に変更できるようになります。

Pythonから外部コマンドやバッチを実行する(subprocess)

逆に、Pythonスクリプトの中から「Windowsのコマンド」や「他のバッチファイル」を実行したいケースもあります。

かつては os.system が使われていましたが、現在は subprocess モジュール を使うのが推奨されています。

subprocess.runの基本的な使い方

subprocess.run を使うと、コマンドを実行し、その完了を待機することができます。

import subprocess

# 'dir' コマンドを実行してファイル一覧を表示する(Windowsの場合)
# shell=True はシェル経由で実行する場合に指定(dirなどの内部コマンドには必須)
result = subprocess.run(["dir", "/w"], shell=True, capture_output=True, text=True)

# 実行結果の表示
print("--- 実行結果 ---")
print(result.stdout)

実行結果

--- 実行結果 ---
 ドライブ C のボリューム ラベルは Windows です
 ... (ファイル一覧が表示される) ...

subprocess.run は非常に多機能です。

引数はリスト形式 ["コマンド", "引数"] で渡すのが基本です。
capture_output=Truetext=True を指定することで、実行結果(標準出力)を文字列として取得し、Pythonプログラム内で変数として扱うことができます。

【重要】shell=True のセキュリティリスクについて
dircopy などのWindows内部コマンドを実行する場合は shell=True が必要ですが、通常の .exe ファイルやスクリプトを実行する場合は shell=False(デフォルト)で使用するのが安全です。
shell=True はコマンドインジェクションのリスクがあるため、外部からの入力をそのままコマンドに使う場合は特に注意してください。

エラーハンドリング(実行できない時の対策)

外部コマンドの実行は、パスの間違いや権限不足などで失敗することがあります。

check=True オプションを付けると、コマンドが失敗した際に例外(CalledProcessError)を発生させてくれます。

import subprocess

try:
    # 存在しないコマンドを実行してみる
    subprocess.run("unknown_command", shell=True, check=True)
except subprocess.CalledProcessError as e:
    print(f"エラーが発生しました: {e}")

バッチ処理を連続して実行する場合、途中でエラーが起きても気づけるように、適切な例外処理を組み込んでおくことが重要です。

本格的な開発におすすめのバッチ処理フレームワーク

小規模なスクリプトであれば標準機能だけで十分ですが、処理が複雑化したり、チームで開発したりする場合は「フレームワーク」の導入を検討しましょう。

コードの可読性が上がり、引数の処理やログ出力が格段に楽になります。

標準ライブラリで完結させる(argparse, logging)

追加インストール不要で使えるのが、標準ライブラリの組み合わせです。

  • argparse: コマンドライン引数を簡単に、かつリッチに定義できます。ヘルプメッセージも自動生成されるため、自作ツールが使いやすくなります。
  • logging: print ではなく logging を使うことで、ログレベル(INFO, ERRORなど)の管理や、ファイルへのログ保存が容易になります。

シンプルで強力な「Click」

Clickは、少ないコード量で美しいコマンドラインインターフェース(CLI)を作成できるサードパーティ製ライブラリです。

デコレータを使って関数をコマンド化できるため、直感的で読みやすいコードになります。

# Clickの例(要 pip install click)
import click

@click.command()
@click.option('--count', default=1, help='繰り返す回数')
@click.option('--name', prompt='あなたの名前は?', help='挨拶する名前')
def hello(count, name):
    for _ in range(count):
        click.echo(f"こんにちは、{name}さん!")

if __name__ == '__main__':
    hello()

このように、@click.option で引数を定義するだけで、型チェックや入力プロンプトまで自動で行ってくれます。

データ処理に特化した「Luigi」や「Airflow」

データ分析基盤や機械学習パイプラインなど、複数のバッチ処理が依存し合う大規模なシステムでは、ジョブ管理フレームワークが必須です。

  • Luigi: Spotifyが開発。タスク間の依存関係(Aが終わったらBを実行するなど)をPythonコードで定義できます。
  • Apache Airflow: Airbnbが開発。GUIでタスクの進行状況を可視化でき、スケジューリング機能も強力です。

これらは学習コストがかかりますが、複雑なワークフローを安定して運用するためには欠かせないツールです。

バッチ処理がうまくいかない時のチェックリスト

最後に、Pythonバッチ処理でよくあるトラブルと解決策をまとめました。

パス(Path)は通っているか、アプリ実行エイリアス問題

「pythonというコマンドとして認識されていません」というエラーが出る場合、環境変数のPathにPythonのインストール場所が追加されていません。

また、Windows 10/11では「pythonと入力するとMicrosoft Storeが開いてしまう」という現象(アプリ実行エイリアス)が起きることがあります。

【対策】

  1. Pythonインストール時に「Add Python to PATH」にチェックを入れる。
  2. Windowsの設定で「アプリ実行エイリアス」からPythonをオフにする。
  3. 確実性を期すなら、py コマンド(Pythonランチャー)を使用するか、Pythonのフルパスを指定する。

権限周りの設定

ファイルの読み書きや、特定のフォルダへのアクセスでエラーになる場合、実行ユーザーの権限を確認してください。

特にWindowsの Program Files フォルダ内などは、管理者権限がないと書き込めないことがあります。

文字コードの問題

WindowsのバッチファイルからPythonを実行した際、日本語が出力されると「文字化け」することがあります。

バッチファイル側で chcp 65001 を行う方法もありますが、副作用が出る場合があるため、Python側で出力を制御するのが安全です。

import sys
# 標準出力をUTF-8に強制(Windowsの文字化け対策)
sys.stdout.reconfigure(encoding='utf-8')

print("これで日本語も文字化けしません")

Pythonのスキルを活かして年収を上げる方法

以上、Pythonでバッチ処理を実装する方法について解説してきました。

なお、Pythonのスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

Pythonエンジニアの需要は非常に高いため、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。

今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。

併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなPythonの案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。