【2026】Python subprocessの使い方!run・stdout・PIPEまで初心者向けに解説

Pythonで外部コマンドを実行したい場合は、subprocessを利用するのがおすすめです。

この記事では、Pythonのsubprocessの使い方を初心者向けに解説します。subprocess.run()の基本構文から、stdout・stderrによる出力取得、subprocess.PIPEの使い方、利用時の注意点まで分かりやすく紹介します。

「PythonからGitやDockerを操作したい」「CLIツールをPythonで自動化したい」という方にも役立つ内容になっているので、ぜひ参考にしてください。

Pythonのsubprocessとは

subprocessは、Pythonから外部コマンドや別プログラムを実行するための標準ライブラリです。ターミナルやコマンドプロンプトで実行する「ls」「dir」「git」などのコマンドを、Pythonコード内から実行できます。

特にPythonのsubprocess.run()を使うと、コマンドの実行から実行結果の取得までを簡単に行えるのが特徴です。標準出力(stdout)や標準エラー(stderr)も取得できるため、実務ではログ確認やエラー処理にも活用されています。

以前はos.system()を使うケースもありましたが、現在のPythonでは、より安全かつ柔軟に扱えるsubprocessが主流になっています。

subprocess.runとos.systemとの違い

subprocess.run()とos.system()は、どちらもPythonから外部コマンドを実行するための機能ですが、現在はsubprocess.run()を利用するのが一般的です。

os.system()はシンプルにコマンドを実行できる一方で、実行結果を取得しづらいというデメリットがあります。また、シェル経由でコマンドを実行するため、安全性の面でも注意が必要です。

一方、subprocess.run()は、実行結果やエラー内容を取得できるほか、タイムアウト設定やエラー検知なども柔軟に行えます。さらに、コマンドと引数をリスト形式で安全に渡せるため、コマンドインジェクションのリスクも軽減できます。

これからPythonを学びはじめる方には、Python入門講座の活用がおすすめです。詳しくはこちらを参考にしてください。

【2026】Python入門講座おすすめ10選!初心者向け学習方法と無料・有料の違いを解説

Pythonでsubprocessが使われる具体的なシーン

Pythonでsubprocessが使われる具体的なシーン

subprocessは、Pythonから外部コマンドやCLIツールを操作したい場面でよく利用されます。特に実務では、ターミナルで実行している作業をPythonで自動化したいケースが多く、業務効率化や運用自動化でも活用されています。

たとえば、以下のようなシーンで利用されることがあります。

  • Gitコマンドを実行してソースコードを自動取得する
  • Dockerコマンドを実行してコンテナを操作する
  • サーバー監視コマンドを定期実行して状態を確認する
  • バッチ処理を自動実行する
  • ログ解析コマンドを実行してエラーを抽出する
  • ffmpegを利用して動画変換を自動化する
  • AWS CLIを実行してクラウド環境を操作する

このように、Pythonのsubprocessは「CLIツールをPythonでまとめて操作する」用途で非常によく利用されています。Python単体では難しい処理でも、既存のコマンドラインツールと組み合わせることで柔軟な自動化を実現できる点が大きな特徴です。

Pythonでsubprocess.runを使う方法

Pythonでsubprocess.runを使う方法

Pythonのsubprocessを利用する際に、最もよく使われるのがsubprocess.run()です。ここでは、subprocess.run()の基本構文やよく使う引数、実際にコマンドを実行する方法を確認していきましょう。

  1. subprocess.runの基本構文
  2. subprocess.runでよく使う引数一覧
  3. 戻り値CompletedProcessの確認方法
  4. check=Trueによるエラー検知

①subprocess.runの基本構文

Pythonのsubprocess.run()の基本構文は、次のようになります。

import subprocess

subprocess.run([“コマンド名”, “引数”])

ターミナルでスペース区切りで入力するコマンドを、Pythonではリスト形式で渡すのがポイントです。

たとえば、「Hello」と表示するechoコマンドを実行する場合は、Pythonで次のように記述します。

import subprocess

subprocess.run([“echo”, “Hello”])

【実行結果】
Hello

このように、Pythonのsubprocess.run()を使うと、Pythonから簡単に外部コマンドを実行できます。

②subprocess.runでよく使う引数一覧

Pythonのsubprocess.run()では、引数を追加することで実行結果の取得やエラー処理などを柔軟に制御できます。代表的な引数は次のとおりです。

引数内容主な用途
capture_output=True標準出力・標準エラーを取得する実行結果をPython側で扱う
text=True出力を文字列として取得する日本語や文字列操作を行う
check=Trueエラー時に例外を発生させるエラー検知
shell=Trueシェル経由でコマンドを実行するWindowsコマンド実行
timeout=秒数一定時間で処理を停止するフリーズ防止
encoding=”utf-8″文字コードを指定する文字化け対策
input=”値”標準入力へ値を渡す入力付きコマンド実行

Pythonの実務においては、実行結果を取得したい場合はcapture_output=True、文字列として扱いたい場合はtext=Trueを組み合わせて利用するケースが一般的になっています。

③戻り値CompletedProcessの確認方法

Pythonのsubprocess.run()を実行すると、戻り値としてCompletedProcessオブジェクトが返されます。CompletedProcessには、実行したコマンドや終了コード、実行結果などが保存されており、コマンド実行後の情報を確認する際に利用します。

サンプルコードは次のとおりです。

import subprocess

result = subprocess.run(
­­ ­­ [“echo”, “Hello”],
­­ ­­ capture_output=True,
­­ ­­ text=True
)

print(result)
print(result.stdout)
print(result.returncode)

※サンプルコードをコピーして試す場合は、全角スペースをタブに置き換えてから実行してください。

【実行結果】
CompletedProcess(args=[‘echo’, ‘Hello’], returncode=0, stdout=’Hello\n’, stderr=”)
Hello
0

このように、CompletedProcessを利用すると、コマンド実行結果やエラー状況をPython側で確認できます。Pythonの実務では、ログ取得やエラー判定などで頻繁に利用されます。

④check=Trueによるエラー検知

Pythonのsubprocess.run()では、check=Trueを指定することで、コマンド実行時にエラーが発生した場合に例外を発生させることが可能です。

通常はコマンドが失敗してもPythonの処理は継続されますが、check=Trueを付けるとエラーを検知しやすくなるため、実務でもよく利用されています。

たとえば、存在しないコマンドを実行すると次のようになります。

import subprocess

subprocess.run(
­­ ­­ [“ls”, “not_found_file”],
­­ ­­ check=True
)

【実行結果】
subprocess.CalledProcessError
Pythonの実務では、Git操作やAWS CLI実行などでコマンド失敗を見逃したくないケースが多いため、check=Trueを利用する場面がよくあります。

subprocessで標準出力と標準エラーを取得するには

subprocessで標準出力と標準エラーを取得するには

Pythonのsubprocess.run()では、コマンドを実行するだけでなく、実行結果やエラー内容を取得できます。ここでは、コマンドの出力結果をPython側で利用したい場合や、エラー内容をログとして保存したい場合に役立つ方法について解説します。

  1. stdoutで実行結果を取得する
  2. stderrでエラー内容を確認する
  3. text=Trueとencoding指定の違い
  4. Windows環境で文字化けを防ぐ方法

①stdoutで実行結果を取得する

stdoutを利用すると、コマンドの実行結果をPython側で取得できます。通常、コマンドの実行結果はターミナルへ表示されますが、stdoutを使うことで、実行結果を変数へ保存して処理できるようになります。

サンプルコードは次のとおりです。

import subprocess

result = subprocess.run(
­­ ­­ [“echo”, “Hello”],
­­ ­­ capture_output=True,
­­ ­­ text=True
)

print(result.stdout)

【実行結果】
Hello
Pythonの実務では、Gitコマンドの実行結果を取得したり、CLIツールの出力内容をPythonで加工したりする場面でよく利用されます。

②stderrでエラー内容を確認する

stderrを利用すると、コマンド実行時に発生したエラー内容をPython側で取得できます。Pythonの実務では、エラーログを保存したり、異常終了の原因を確認したりする場面でよく利用されます。

たとえば、存在しないファイルを指定してlsコマンドを実行するサンプルは次のとおりです。

import subprocess

result = subprocess.run(
­­ ­­ [“ls”, “sample_file”],
­­ ­­ capture_output=True,
­­ ­­ text=True
)

print(result.stderr)

【実行結果】
ls: cannot access ‘sample_file’: No such file or directory
このように、Pythonのsubprocess.run()でstderrを利用すると、コマンド実行時のトラブル原因を確認しやすくなります。特にGit操作やAWS CLI実行など、エラー内容を確認しながら処理を行いたい場面で役立ちます。

③text=Trueとencoding指定の違い

subprocess.run()のtext=Trueは、コマンドの実行結果をPythonの文字列として取得するための設定です。指定しない場合、実行結果は「バイト列(bytes型)」として返されます。

次のようにtext=Trueを指定すると、文字列として扱えるようになります。

import subprocess

result = subprocess.run(
­­ ­­ [“echo”, “Hello”],
­­ ­­ capture_output=True,
­­ ­­ text=True
)

print(result.stdout)

一方、encodingは文字コードを指定するための設定です。特にWindows環境では、日本語を含む出力結果が文字化けすることがあるため、Python側で文字コードを明示的に指定するケースがあります。

import subprocess

result = subprocess.run(
­­ ­­ [“dir”],
­­ ­­ shell=True,
­­ ­­ capture_output=True,
­­ ­­ text=True,
­­ ­­ encoding=”cp932″
)

上のサンプルコードでは、Windows日本語環境で利用されるcp932を指定しています。

つまり、text=Trueは「文字列として扱う設定」、encodingは「どの文字コードで変換するかを指定する設定」です。日本語を扱う場合は、両方を組み合わせて利用するケースがよくあります。

④Windows環境で文字化けを防ぐ方法

Windows環境でPythonのsubprocess.run()を利用する場合、日本語の実行結果が文字化けすることがあります。これは、WindowsのコマンドプロンプトがUTF-8ではなく、cp932(Shift-JIS系)という文字コードを利用しているケースが多いためです。

次のようにdirコマンドの結果を取得すると、環境によっては日本語が正しく表示されないことがあります。

import subprocess

result = subprocess.run(
­­ ­­ [“dir”],
­­ ­­ shell=True,
­­ ­­ capture_output=True,
­­ ­­ text=True
)

print(result.stdout)

このような場合は、encodingを指定することで文字化けを防げます。

import subprocess

result = subprocess.run(
­­ ­­ [“dir”],
­­ ­­ shell=True,
­­ ­­ capture_output=True,
­­ ­­ text=True,
­­ ­­ encoding=”cp932″
)

print(result.stdout)

WindowsのPython環境ではCLIツールやログ出力で日本語を扱うケースも多いため、text=Trueとあわせてencoding=”cp932″を指定する方法を覚えておくと便利です。

subprocess.PIPEの使い方

subprocess.PIPEの使い方

subprocess.PIPEは、コマンドの実行結果や入力データをPython側で受け渡しするための仕組みです。簡単にいうと、「コマンドとPythonをつなぐ通路」のような役割があります。

たとえばコマンドの実行結果を取得する場合は、次のようにstdout=subprocess.PIPEを指定します。

import subprocess

result = subprocess.run(
­­ ­­ [“echo”, “Hello”],
­­ ­­ stdout=subprocess.PIPE,
­­ ­­ text=True
)

print(result.stdout)

このコードでは、stdout=subprocess.PIPEを指定することで、コマンドの実行結果をPython側で取得しています。取得した内容はresult.stdoutに格納されるため、文字列として利用できます。

Pythonでsubprocessを利用する際の注意点

Pythonでsubprocessを利用する際の注意点

Pythonのsubprocessは非常に便利なライブラリですが、使い方を誤るとセキュリティリスクやプログラム停止の原因になることがあります。ここでは、Pythonのsubprocessを安全に利用するために知っておきたい注意点を解説します。

  1. shell=Trueにはリスクがある
  2. コマンドインジェクションに注意
  3. timeout設定でフリーズを防ぐ

①shell=Trueにはリスクがある

Pythonのsubprocess.run()では、shell=Trueを指定することで、シェル経由でコマンドを実行できます。Windowsのdirコマンドなど、一部のコマンドを実行する際に利用される方法です。

ただし、shell=Trueを利用すると、シェルがコマンド文字列を解釈するため、意図しないコマンドまで実行されるリスクがあります。特に、ユーザー入力を含むコマンドをそのまま実行すると、セキュリティ上の問題につながる可能性があります。

そのため、特別な理由がない限りはshell=Trueを使わず、コマンドと引数をリスト形式で渡す方法が推奨されています。

②コマンドインジェクションに注意

コマンドインジェクションとは、悪意のある入力によって、想定外のコマンドを実行されてしまう攻撃のことです。Pythonのsubprocessで外部入力を扱う場合は、特に注意が必要です。

たとえばユーザーが入力した文字列をPython側でそのままコマンドへ結合すると、不正なコマンドまで実行される可能性があります。shell=Trueと組み合わせると、さらにリスクが高くなります。

Pythonのsubprocessを安全に利用するためには、コマンドを文字列結合せず、リスト形式で引数を渡す方法が重要です。また、ユーザー入力を利用する場合は、入力値の検証を行うことも大切です。

③timeout設定でフリーズを防ぐ

Pythonのsubprocess.run()で実行したコマンドは、処理内容によっては終了までに長時間かかることがあります。場合によっては、処理が停止したまま戻ってこないケースもあるため注意が必要です。

このような状況を防ぐために利用されるのがtimeoutです。timeoutを指定すると、一定時間を超えた場合に処理を停止できます

外部APIを利用するCLIツールや大量データを処理するコマンドでは、想定以上に処理時間が延びることも珍しくありません。プログラム全体の停止を防ぐためにも、実務ではtimeoutを設定しておくと安心です。

近年では、生成AIを活用したAIコーディングも注目を集めています。こちらで詳しく解説しているので、あわせて参考にしてください。

【2026】AIコーディング入門!仕組み・できること・初心者向け実践までまとめて解説

Pythonを体系的に学べるおすすめのセミナー

Python基礎セミナー講習

Pythonを実務で活用したい方には、Pythonを体系的に学べる「Python基礎セミナー講習」の受講がおすすめです。初心者向けに構成されているため、プログラミング経験が少ない方でも基礎から段階的に学習できます。

Pythonの基礎文法やライブラリの使い方はもちろん、Webスクレイピング、データ分析、Excel自動化、画像処理、AIプログラム実装など、実務につながる内容まで幅広く学べるのが特徴です。また、エラー解決の考え方やPythonを使った業務効率化についても学習できます。

実際に手を動かしながら学べるカリキュラムになっているため、「独学では理解しづらかった」「何から学べばよいか分からない」という方にも適しています。subprocessのような実務で役立つライブラリを含め、Pythonスキルを体系的に身につけたい方におすすめです。

セミナー名Python基礎セミナー講習
運営元GETT Proskill(ゲット プロスキル)
価格(税込)29,700円〜
受講期間2日間
受講形式対面(東京・名古屋・大阪)・ライブウェビナー・eラーニング

Python基礎セミナー講習の詳細はこちら

Pythonのsubprocessで外部コマンド実行を使いこなそう

subprocessを利用すると、Pythonから外部コマンドを実行できるようになり、CLIツールとの連携や業務自動化を効率的に行えます。特にsubprocess.run()を使えば、コマンド実行だけでなく、標準出力やエラー内容の取得も簡単に実装可能です。

subprocessは、Git操作やサーバー管理、バッチ処理、AWS CLI実行など、実務でも活用される重要なライブラリです。ぜひ基本的な使い方を身につけ、Pythonによる外部コマンド実行や業務自動化へ活用していきましょう。

最新情報をチェックしよう!