📖
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_call
はrun(..., check=True)
と似ていますが、stdout
やstderr
を直接キャプチャする機能はありません。出力が必要な場合はsubprocess.run()
を使用する方が柔軟です。
この文章はAIによって加筆・完成されました。
Discussion