【Python標準ライブラリ編 #4】subprocessでPC操作を自動化!自分だけの便利ランチャーを作ろう

ALL

こんにちは、Tech Samuraiです!
これまでの冒険で、私たちはファイル操作時間計算データ保存といった、Pythonの標準ライブラリが持つ様々な力を探検してきました。

しかし、Pythonの力はスクリプトの中だけで完結するものではありません。もし、Pythonプログラムの中から、ターミナルでいつも入力しているあの面倒なコマンド(git statusや、サーバーへのSSH接続など)を直接実行できるとしたら、どうでしょう?

今回のテーマは、それを実現するための超強力な標準ライブラリ**`subprocess`**です。このライブラリを使い、よく使うコマンドに短い「あだ名」をつけて、簡単に呼び出せる**「自分だけのオリジナル・コマンドランチャー」**を開発します。あなたのPythonは、PC操作の頼れる「司令塔」へと進化します!


ステップ1:司令塔の武器 – `subprocess`と`sys`

今回のプロジェクトで使う2つの重要な標準ライブラリを紹介します。

  • `subprocess`ライブラリ:
    Pythonスクリプトの中から、外部のプログラムやターミナルのコマンドを実行するためのライブラリです。まさにPythonからOSを操るための「魔法の杖」です。
  • `sys`ライブラリ:
    Pythonのインタプリタ自体と対話するためのライブラリです。今回は、その中の`sys.argv`という機能を使い、スクリプト実行時に与えられた指示(引数)を受け取る「耳」の役割を果たします。

ステップ2:コマンドを実行する基本 – `subprocess.run()`

まずは、`subprocess`ライブラリを使って、Pythonから簡単なコマンドを実行してみましょう。

import subprocess
import platform # OSを判定するためにインポート

# OSによって実行するコマンドを変える
if platform.system() == "Windows":
    command = ["dir"]
else:
    command = ["ls", "-l"]

# subprocess.run()でコマンドを実行
# check=True: コマンドが失敗したらエラーを出す
# capture_output=True: コマンドの実行結果を捕まえる
# text=True: 結果をテキストとして扱う
try:
    result = subprocess.run(command, check=True, capture_output=True, text=True)

    print("--- コマンドの実行に成功しました ---")
    print("--- 実行結果 ---")
    print(result.stdout) # result.stdout に実行結果が格納されている

except FileNotFoundError:
    print(f"エラー: コマンド '{command[0]}' が見つかりません。")
except subprocess.CalledProcessError as e:
    print(f"エラー: コマンドの実行に失敗しました。")
    print(e.stderr)

【重要ポイント】
subprocess.run()にコマンドを渡す際は、"ls -l"のような単一の文字列ではなく、["ls", "-l"]のように**リスト形式で渡す**のが、セキュリティ上も安全で推奨される方法です。


ステップ3:指示を受け取る耳 – `sys.argv`

次に、`python launcher.py git`のように、スクリプト名の後に付けられた指示(`git`の部分)を受け取る方法を学びます。これには`sys.argv`を使います。

`sys.argv`は、コマンドライン引数を格納したリストです。簡単なスクリプトで試してみましょう。

# show_args.py
import sys

print(f"sys.argv の中身: {sys.argv}")
print(f"スクリプト名: {sys.argv[0]}")
if len(sys.argv) > 1:
    print(f"最初の指示: {sys.argv[1]}")

このファイルをターミナルでpython3 show_args.py hello samuraiと実行すると、以下のように表示されます。

sys.argv の中身: ['show_args.py', 'hello', 'samurai']
スクリプト名: show_args.py
最初の指示: hello

`sys.argv[0]`には必ずスクリプト名が、`sys.argv[1]`以降にユーザーが与えた指示が順番に入ることが分かりますね。


ステップ4:ランチャーの設計と実装

それでは、これまでの知識を組み合わせて、コマンドランチャーを完成させましょう。コマンドの「あだ名」と「実際のコマンド」の対応は、辞書で管理するのがスマートです。

# launcher.py
import sys
import subprocess

# --- あだ名とコマンドの対応辞書 ---
# ここを編集すれば、自分だけのコマンドを自由に追加できる!
COMMANDS = {
    "list": ["ls", "-lha"],
    "git": ["git", "status"],
    "server": ["ssh", "tech-samurai@your-server.com"], # あなたのサーバー情報に書き換えてください
    "docker": ["docker-compose", "ps"]
}

def main():
    # --- 指示(引数)の受け取り ---
    if len(sys.argv) < 2:
        print("使い方: python launcher.py [あだ名]")
        print("利用可能なあだ名:", ", ".join(COMMANDS.keys()))
        sys.exit(1) # エラー終了

    alias = sys.argv[1]

    # --- 辞書からコマンドを取得 ---
    if alias not in COMMANDS:
        print(f"エラー: あだ名 '{alias}' が見つかりません。")
        sys.exit(1)

    command_to_run = COMMANDS[alias]
    print(f">>> 実行コマンド: {' '.join(command_to_run)}")
    print("-" * 20)

    # --- コマンドの実行 ---
    try:
        # shell=Falseがデフォルトで安全 (リスト形式の場合)
        subprocess.run(command_to_run, check=True)
    except FileNotFoundError:
        print(f"エラー: コマンド '{command_to_run[0]}' が見つかりません。パスを確認してください。")
    except subprocess.CalledProcessError:
        print("エラー: コマンドの実行中に問題が発生しました。")
    except KeyboardInterrupt:
        print("\nユーザーによって中断されました。")


if __name__ == "__main__":
    main()

まとめ

今回は、`subprocess`と`sys`という2つの強力な標準ライブラリを使い、日々の面倒なコマンド入力を自動化する、あなただけのオリジナル・コマンドランチャーを作成しました。

  • `subprocess.run()`で、Pythonから外部コマンドを実行する方法。
  • `sys.argv`で、スクリプトに渡された指示を読み取る方法。
  • **辞書**を使って、柔軟で拡張性の高い設定を管理する方法。

あなたのPythonは、もはやスクリプトの世界に留まらず、PC全体を操作する強力な「司令塔」としての第一歩を踏み出しました。ぜひ、あなたが普段よく使うコマンドをCOMMANDS辞書にどんどん追加して、あなただけの最強のランチャーに育ててみてください!

コメント

タイトルとURLをコピーしました