📖

Pythonでストレスなくコマンドを実行する。

に公開

背景

Pythonからコマンドを実行したい場合があると思います。
色々と苦戦する場合があるので、ここに備忘録をためておきます。

やり方

os.system()

下記のようなイメージで実行可能です。

import os
ret=os.system("echo $SHELL")
print(ret)
  • retには数値型の返り値が入ります。(例:0)
  • 実行はSHでされます。
  • 標準出力やエラーの受け取りはできません。

subprocess

run

subprocess.run() は、Python 3.5 以降で推奨されるコマンド実行方法です。コマンドの実行、標準出力、標準エラーの取得、終了コードの確認など、柔軟な制御が可能です。

import subprocess

# コマンドを実行し、結果を取得
result = subprocess.run(['echo', 'Hello, subprocess.run!'], capture_output=True, text=True)

print(f"Stdout: {result.stdout}")
print(f"Stderr: {result.stderr}")
print(f"Exit Code: {result.returncode}")

# エラー時に例外を発生させる
try:
    subprocess.run(['false'], check=True)
except subprocess.CalledProcessError as e:
    print(f"Error: {e}")
  • capture_output=True: 標準出力と標準エラーをキャプチャします。
  • text=True: 出力をテキストとしてデコードします(Python 3.7 以降では encoding='utf-8' のエイリアス)。
  • check=True: コマンドがゼロ以外の終了コードを返した場合に CalledProcessError を発生させます。
  • returncode: コマンドの終了コードです。
  • stdout, stderr: コマンドの標準出力と標準エラーです。

check_call

subprocess.check_call() は、コマンドを実行し、成功した場合は終了コードを返します。コマンドがゼロ以外の終了コードを返した場合(つまり失敗した場合)は、CalledProcessError 例外を発生させます。これは、コマンドの成功が必須である場合に便利です。

import subprocess

try:
    # コマンドを実行し、成功すれば終了コードを返す
    subprocess.check_call(['ls', '-l'])
    print("Command executed successfully.")
except subprocess.CalledProcessError as e:
    print(f"Command failed with error: {e}")

try:
    # 失敗するコマンドの例
    subprocess.check_call(['false'])
except subprocess.CalledProcessError as e:
    print(f"Expected error: {e}")
  • check_callrun(..., check=True) と似ていますが、stdoutstderr を直接キャプチャする機能はありません。出力が必要な場合は subprocess.run() を使用する方が柔軟です。

この文章はAIによって加筆・完成されました。

Discussion