はじめに
この記事では、小さなPythonスクリプトを使って"ちょっと便利なタスク実行ツール"を作る方法を紹介します。
特定のスクリプトを定期実行したい場合や様々な機械学習実験を(寝ている間なども)順番に実行する場合などに使えます。具体例は機械学習の話が多めですが、他の分野でも応用可能だと思います。
また、この記事で紹介する内容は、Pythonでなくとも、例えばシェルスクリプト、cron、GitHub Actionsなどを用いても同様のことを実現できることがあります。シーンに合わせて技術選定して頂ければ幸いです。
前提知識: && を使ってコマンドをつなぐ
まず前提として、ターミナルでは && を使ってコマンドをつなぐことができます。
例えば、code_a.py -> code_b.py と順番に実行したい場合は、下記のワンライナーコマンドで十分です。
python3 code_a.py && python3 code_b.py
応用として、機械学習実験でパラメーターを標準引数で受け取れるようにしておけば、次のように複数の実験を続けて実行できます。これで寝ている間など長時間PCを確認できない場合でも安心です。
python3 experiments/exp504/run.py exp=011-full-seed101 && python3 experiments/exp504/run.py exp=011-full-seed102 && python3 experiments/exp504/run.py exp=011-full-seed103
コマンドを繰り返す repeat.py を作る
まずは「任意のコマンドを指定回数だけ繰り返す」小さなPythonスクリプトです。
subprocessライブラリを使うことで、PythonスクリプトからPythonスクリプトを実行することができます。
# repeat.py
import sys
import subprocess
count = int(sys.argv[1])
command = sys.argv[2]
for i in range(count):
print(f"[{i+1}/{count}] Executing: {command}")
subprocess.run(command, shell=True)
使い方:
python3 repeat.py <繰り返し回数> "<コマンド>"
例えば、print("A")するだけのcode_a.pyを3回実行するコマンドは下記です。
python3 repeat.py 3 "python3 code_a.py"
結果:
[1/3] Executing: python3 code_a.py
A
[2/3] Executing: python3 code_a.py
A
[3/3] Executing: python3 code_a.py
A
repeat.pyによって、特定のコマンドを複数回実行する際に、ちょっと楽になりました。繰り返し回数が大きい場合に特に効果を発揮します。
待機用の sleep.py を作る
続いて、シンプルに「指定秒数待つだけ」の小さなPythonスクリプトです。
# sleep.py
import sys
import time
sec = int(sys.argv[1])
print(f"Sleeping for {sec} seconds...")
time.sleep(sec)
MacやLinuxをお使いの方は、標準の sleep コマンドを使っても同様のことが実現できます。Pythonスクリプトを用いる方法は、OSを問わず使うことができ、カスタマイズ性が高いというメリットがあります。
使い方:
python3 sleep.py <待機秒数>
300秒待つだけのコマンドは下記となります。
python3 sleep.py 300
code_a.py -> 300秒待機 -> code_b.py と順番に実行したい場合は、下記のワンライナーコマンドで実現できます。
python3 code_a.py && python3 sleep.py 300 && python3 code_b.py
sleep.pyは一定のクーリングタイムを設けたい場合などに有効です。
組み合わせ例
スクリプトAの実行を10回、1時間ごとに繰り返す
python3 repeat.py 10 "python3 code_a.py && python3 sleep.py 3600"
まとめ
- Pythonで小さなユーティリティを書くと、作業自動化がとても楽になる
- コマンドチェーンと組み合わせると、小規模な自動化が簡単に作れる
-
sleep.pyとrepeat.pyの組み合わせは相性が良い - 機械学習実験のバッチ実行や深夜実行にも便利
今回は省略しましたが、通知スクリプトやGPUの動作状況確認スクリプトなども組み合わせると、さらに効率化ができます。
本記事は以上です。こうしたちょっとした自動化によって、時間を少しでも多く捻出して機械学習実験を回しまくりましょう!