概要
とあるディレクトリにある複数のシェルスクリプトファイルを1コマンドで勝手に一つずつ実行させていくコードを書いたので紹介します。
サンプルコード解説
import subprocess
import os
# スクリプトが存在するフォルダのパス(現在のディレクトリとしています)
folder_path = './'
scripts = sorted([files for files in os.listdir(folder_path) if files.endswith('.sh')])
# APIのエンドポイント
api_endpoint = 'http://localhost/api'
for script in scripts:
script_path = os.path.join(folder_path, script)
print(f"Executing {script}...")
subprocess.run(['sh', script_path, api_endpoint])
print(f"Finished executing {script}.\n")
os
モジュールのlistdir
関数は、指定されたディレクトリ内のすべてのファイルとディレクトリと名前をlist
として取得する関数。リスト内包表記を使用して、取得したファイル名のリストから.sh
で終わるファイル名を選択しています。これにより、シェルスクリプトのファイルたちが取得できます。
sorted
関数を使用しているのは、ファイル名のリストをアルファベット順にソートしたいためです。特にソートしない場合は順番など関係なくランダムに(?)実施されていくので、ソートして実施した方が分かりやすいと思いました。
あとは、ソートされたシェルスクリプトのリストをループで回し、各スクリプトをsubprocess.run
関数を使用して実行していきます。この関数は、指定されたコマンドを実行することができるので外部のシェルスクリプトを実行させる際に使えます。こちらの関数については以前別記事で書いたこともあるのでご参考までに(以下にも書きましたが、例外処理を入れる場合はsubprocess.CalledProcessError
でキャッチできます)。
詳細にいうと、script_path
で指定されたシェルスクリプトをsh
コマンドを使って実行し、そのスクリプトにapi_endpoint
を引数として渡しています。これにより、Pythonスクリプトから外部のシェルスクリプトを実行し、そのスクリプトに必要なデータを渡すことができました。