IT管理のマメ知識

ITについて個人の感想をアウトプットしているブログ

batファイルからpythonコードを実行する方法

batファイル化する目的とメリット

  • Windowsのbatファイルから、直接pythonコードを実行できると、とても便利です。
  • 一般に、batファイル化することでWindowsサーバのタスクスケジューラからpythonコードを繰り返し実行でき、データ処理を自動化できるようになります。
  • このサンプルでは、openpyxlを用いて、サーバサイドでExcelファイル出力を自動化します。

Windows batファイルの役割

  • batファイルから行いたいことは、以下の通りです。
    • 特定のAnaconda仮想環境を有効化(Activate)
    • pythonコ-ドを実行

以下のサンプル例の前提条件

  • 仮想環境[test1]が作成済み。
  • openpyxlがinstall済み。

pythonコ-ドを作成します

  • 「test1.py」を作成します(以下のコード)。Excelファイルを作成するサンプルコードが含まれています。
  • なお、Windowsのbatファイルにて「CDコマンド」で指定した「カレントディレクトリ」は、pythonコードに対しては有効ではありませんので、pythonコード中で
    「os.chdirコマンド」を使用して 実行中のpythonコードでの「カレントディレクトリ」を指定しています。
  • openpyxl ライブラリを使用してExcelファイルを作成します。
[test1.py]

import os

from openpyxl import Workbook
import datetime

os.chdir('C:\Anaconda_Datas')

now = datetime.datetime.now()
print ('# python code started : '+ now.strftime("%m/%d/%Y, %H:%M:%S"))

# Excel WorkBook
wb = Workbook()

# grab the active worksheet
ws = wb.active

# セルに直接データを配置することができます
ws['A1'] = 42

# 行にも配置できます
ws.append([1, 2, 3])

# Pythonデータ型は自動でdatetime型に変換されます
ws['A2'] = datetime.datetime.now()

# Excelファイルを保存します(os.chdirコマンドで指定したカレントディレクトリに保存されます。)
wb.save("sample.xlsx")

now = datetime.datetime.now()
print ('# python code End     : '+ now.strftime("%m/%d/%Y, %H:%M:%S"))

Windowsバッチファイルを作成

  • batファイルには、以下のように記述します。
  • batファイルを呼び出しているWindowsコマンドプロンプトは直ぐに閉じてしまうため、pythonコードがちゃんと実行されたかどうか分かり難いので、[>> activate_test1.log]として、出力をテキストファイルに保存しています。
[activate_test1.bat]

CD /D C:\Anaconda_Datas                                             

REM 仮想環境を有効化します
CALL C:\Anaconda_Datas\envs\test1\Lib\venv\scripts\nt\activate.bat     >> activate_test1.log

REM Pythonコ-ドを実行します
C:\ProgramData\Anaconda3\python.exe C:\Anaconda_Datas\test1.py         >> activate_test1.log

REM 仮想環境を無効化します
CALL C:\Anaconda_Datas\envs\test1\Lib\venv\scripts\nt\deactivate.bat   >> activate_test1.log

batファイルを実行

  • Windowsコマンドプロンプトからbatファイルを実行します。
  • batファイルが正常に実行されると、"sample.xlsx"と"activate_test1.log"が作成されます。

f:id:persimoon:20210103180010j:plain

  • [activate_test1.log]には、以下のように出力されました。
[activate_test1.log]

# python code started : 01/03/2021, 17:53:32
# python code End     : 01/03/2021, 17:53:33