こんにちは、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
辞書にどんどん追加して、あなただけの最強のランチャーに育ててみてください!
コメント