subprocessによるコマンド実行
外部プログラムを実行します
「subprocessによるコマンド実行」はCoddyKit上の無料Python Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはPython Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Python Academyコースには全4レッスンが含まれています。
subprocessとは
subprocessモジュールを使うと、ターミナルに入力する場合と同じように、Pythonプログラムから外部コマンドや他のプログラムを実行できます。
import subprocess
result = subprocess.run(['echo', 'hello'])
print('return code:', result.returncode)subprocess.runの基本
subprocess.run()は推奨されるエントリーポイントです。コマンドは引数のリストとして渡します。最初にプログラム名を指定し、その後に各引数を個別に指定します。
import subprocess
result = subprocess.run(['echo', 'one', 'two'])
print('done with code', result.returncode)文字列ではなくリストを使う理由
リストを渡すと、シェルによるコマンドの解析を避けられるため、引用符に関するバグやシェルインジェクションのリスクを防げます。各要素が1つの引数になります。
import subprocess
# Safe: each piece is its own argument
subprocess.run(['echo', 'a file with spaces.txt'])CompletedProcessオブジェクト
run()は、args、returncode、さらに出力をキャプチャした場合はその出力を保持するCompletedProcessを返します。コード0は成功を意味します。
import subprocess
cp = subprocess.run(['true'])
print('args:', cp.args)
print('returncode:', cp.returncode)戻り値の確認
通常、ゼロ以外の戻り値はコマンドが失敗したことを示します。呼び出し後に手動で確認できます。
import subprocess
cp = subprocess.run(['ls', '/no/such/path'])
if cp.returncode != 0:
print('command failed with', cp.returncode)check=Trueで失敗時に例外を発生させる
check=Trueを渡すと、コマンドがゼロ以外で終了したときにrun()が自動的にCalledProcessErrorを発生させます。
import subprocess
try:
subprocess.run(['false'], check=True)
except subprocess.CalledProcessError as e:
print('failed with code', e.returncode)引数の渡し方
コマンドに追加する引数は、リストに要素を追加するだけです。ここではディレクトリの内容を詳細形式で表示します。
import subprocess
subprocess.run(['echo', '-n', 'no newline'])
print()
print('above echo had -n flag')タイムアウトの設定
timeoutを使うと、実行時間が長すぎるコマンドを中止できます。その場合はTimeoutExpiredが発生します。
import subprocess
try:
subprocess.run(['sleep', '5'], timeout=0.1)
except subprocess.TimeoutExpired:
print('command took too long, aborted')作業ディレクトリ
cwd引数を使うと、プログラム自体の作業ディレクトリを変更せずに、指定したディレクトリでコマンドを実行できます。
import subprocess
subprocess.run(['pwd'], cwd='/tmp')shell=Trueオプション
shell=Trueを指定すると、シェルが解釈する単一のコマンド文字列を渡します。パイプやワイルドカードを使えるようになりますが、信頼できない入力に対しては危険です。リスト形式を優先してください。
import subprocess
subprocess.run('echo hello && echo world', shell=True)os.systemを避ける
古いos.systemは終了コードを返すだけで、安全な引数の受け渡しや出力のキャプチャには対応していません。新しいコードでは、あらゆる場合にsubprocess.runを使用してください。
import subprocess
# Modern, safe approach
cp = subprocess.run(['echo', 'modern way'])
print('exit code:', cp.returncode)確認問題
コマンド実行の理解度を確認しましょう。
復習
subprocessでコマンドを実行する方法を学びました。
subprocess.run([...])は外部プログラムを安全に実行します。returncodeを持つCompletedProcessを返します。check=Trueは失敗時に例外を発生させ、timeoutは時間のかかるコマンドを中止します。shell=Trueよりもリスト形式を優先します。
次は、コマンドの出力をキャプチャします。
よくある質問
「subprocessによるコマンド実行」レッスンは無料ですか?
はい。「subprocessによるコマンド実行」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Python Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Python Academyコースには全4レッスンが含まれています。
「subprocessによるコマンド実行」で何を学びますか?
外部プログラムを実行します ブラウザで直接実行するハンズオンコードでPython Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Python Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのPython Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「subprocessによるコマンド実行」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このPython Academyレッスンでコードを書いて実行できますか?
はい。すべてのPython Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- subprocessによるコマンド実行
- 出力の取得
- 環境とosモジュール
- ファイル操作のためのshutil