スポンサーリンク

Pythonでシェルコマンドを実行する方法|subprocessモジュールの使い方と注意点を解説!

自動化スクリプト
  1. はじめに|Pythonからコマンド操作ってどうやるの?
  2. 1. subprocessモジュールの基本|まずはrun関数を覚えよう
    1. 🔹 まずはインポートしよう
    2. 🔹 一番よく使うのは subprocess.run()
    3. 🔹 MacやLinuxでも使える!リスト形式の書き方
  3. 2. 実行結果を受け取る|標準出力・エラー・戻り値の取得
    1. 🔹 出力を取得するには capture_output=True
    2. 🔹 run()の戻り値から得られる情報
    3. 🔹 失敗例も見てみよう
  4. 3. エラーやタイムアウト処理も大事!例外処理の書き方
    1. 🔹 try-exceptで安全にコマンドを実行しよう
    2. 🔹 タイムアウトも防げる!timeoutの使い方
    3. 🔹 まとめ:エラー処理の書き方はこう覚えよう!
  5. 4. 他のスクリプトやファイルを実行してみよう
    1. 🔹 バッチファイル(.bat)や実行ファイル(.exe)を実行する
    2. 🔹 PythonファイルをPythonで実行する
    3. 🔹 ファイルパスを扱うときの注意点
  6. 5. PowerShellを使いたいとき(Windowsユーザー向け)
    1. 🔹 基本の書き方:powershell -Command
    2. 🔹 バックスラッシュやパスの注意点
    3. 🔹 PowerShellならではの便利コマンドもOK
  7. 6. どんなときに使う?subprocessの活用場面
    1. 🔹 Pythonだけでは書きづらいことに便利!
    2. 🔹 Pythonでできるなら、それでもOK!
    3. 🔹 コマンドとPythonの「いいとこ取り」がカギ!
  8. まとめ
    1. あわせて読みたい
  9. よくある質問(Q&A)
    1. 関連投稿:

はじめに|Pythonからコマンド操作ってどうやるの?

パソコンを使っていると、「コマンドプロンプト(Windows)」や「ターミナル(Mac)」で作業したことがある人もいると思います。たとえば、フォルダを作ったり、ファイルをコピーしたり、アプリを起動したり…そんな操作を“コマンド”でサクッとできるのが便利ですよね。

でも、「Pythonからそういうコマンド操作ってできるの?」と思ったことはありませんか?

実はできます!
それを実現してくれるのが、**subprocess(サブプロセス)**というモジュールです。

このモジュールを使うと、Pythonのコードの中から、ターミナルで使っているコマンドをそのまま実行できます。たとえば:

import subprocess

subprocess.run("mkdir test_folder", shell=True)

このコードを実行すると、「test_folder」という名前のフォルダが自動で作られます。まるでターミナルに打ち込んだかのように、Pythonが代わりにやってくれるんです。

「なんだかすごい!」と思ったあなた、その直感は正解です。
この機能を使えば、バッチ処理や自動化スクリプトをもっと便利に作れるようになります。

この記事では、subprocessモジュールの基本から、実行結果の受け取り方、タイムアウトやエラー処理の方法、さらにはPowerShellを使った応用まで、初心者にもわかりやすく解説していきます。

「Pythonでコマンドを動かしたい!」と思ったら、この記事を見ればOKです!




1. subprocessモジュールの基本|まずはrun関数を覚えよう

Pythonでシェルコマンドを実行するときに使うのが、subprocessという標準モジュールです。これはPythonに最初から付いているので、インストールは不要です。

🔹 まずはインポートしよう

import subprocess

これで準備OK!

🔹 一番よく使うのは subprocess.run()

たとえば、Windowsで「フォルダを作る」コマンド(mkdir test_folder)をPythonから実行したいときは、こう書きます:

subprocess.run("mkdir test_folder", shell=True)

このように、コマンドを文字列で渡すときは、shell=Trueを付けるのがポイントです。これがあると、Pythonがターミナルの代わりにコマンドを実行してくれます。

🔹 MacやLinuxでも使える!リスト形式の書き方

もし「コマンドをリストで渡したい」という場合は、次のように書きます:

subprocess.run(["mkdir", "test_folder"])

この書き方では、shell=Trueは不要です。むしろ付けない方が安全です。コマンドとその引数を分けてリストで渡すことで、より正確に実行できます。

ただし注意点もあります。たとえば *$HOME などの**シェルの特殊文字(ワイルドカード)**は、このリスト形式では使えません。そういうときは、素直に文字列+shell=Trueにしましょう。




2. 実行結果を受け取る|標準出力・エラー・戻り値の取得

シェルコマンドを実行したとき、「そのコマンドがうまくいったのか」「どんな結果が出力されたのか」が気になることってありますよね。Pythonでは、subprocess.run()をちょっと工夫するだけで、コマンドの出力結果やエラー内容をしっかり受け取ることができます。

🔹 出力を取得するには capture_output=True

result = subprocess.run("echo Hello", shell=True, capture_output=True, text=True)
print(result.stdout)

この例では、echo Helloというコマンドを実行しています。そして、capture_output=Truetext=Trueをつけることで、出力を文字列として取得できます。

結果はこうなります:

Hello

ポイントは、result という戻り値の中にいろいろな情報が詰まっていることです。


🔹 run()の戻り値から得られる情報

属性内容
result.stdoutコマンドの標準出力(正常な出力)
result.stderrコマンドの標準エラー出力(失敗時のメッセージなど)
result.returncodeコマンドの終了コード(0なら成功、1以上ならエラー)

🔹 失敗例も見てみよう

result = subprocess.run("dir no_such_folder", shell=True, capture_output=True, text=True)
print("returncode:", result.returncode)
print("stderr:", result.stderr)

存在しないフォルダを表示しようとすると、こんな感じになります:

returncode: 1
stderr: 指定されたファイルが見つかりません。

こんなふうに、失敗のときもきちんと理由を確認できるので、エラー処理にも役立ちます。




3. エラーやタイムアウト処理も大事!例外処理の書き方

コマンドの実行は、いつもスムーズにいくとは限りません。ファイルがなかったり、アクセス権がなかったり、コマンドが長時間かかったり…。そういった「もしも」のときに備えて、Pythonでは**例外処理(エラーハンドリング)**を書くのがオススメです。


🔹 try-exceptで安全にコマンドを実行しよう

コマンド実行に失敗したとき、Pythonではエラーを「例外」として投げることができます。以下はその基本の形です:

import subprocess

try:
subprocess.run("dir no_such_folder", shell=True, check=True)
except subprocess.CalledProcessError as e:
print("エラーが発生しました!")
print("戻り値:", e.returncode)

ポイントは、check=Trueを付けること。これをつけると、コマンドが失敗(終了コードが0以外)したときに例外が発生します。


🔹 タイムアウトも防げる!timeoutの使い方

時間のかかるコマンドや、待機系(例:ping、pause)を使うときには、タイムアウトの設定がとても大切です。

try:
subprocess.run("ping 127.0.0.1 -n 10", shell=True, timeout=3)
except subprocess.TimeoutExpired:
print("タイムアウトしました!")

このように、timeout=秒数で時間制限を設定できます。指定時間を超えても処理が終わらなかった場合、TimeoutExpiredという例外が発生します。


🔹 まとめ:エラー処理の書き方はこう覚えよう!

  • check=True → コマンド失敗時に例外が発生
  • timeout=秒数 → 長すぎる処理を強制終了
  • try-exceptで例外をキャッチして丁寧に対応



4. 他のスクリプトやファイルを実行してみよう

Pythonのsubprocessモジュールは、ターミナルのコマンドだけじゃなく、他のプログラムやスクリプトも実行できます。たとえば .bat ファイルや .exe ファイル、さらには別の .py ファイル(Pythonスクリプト)も動かせちゃいます。


🔹 バッチファイル(.bat)や実行ファイル(.exe)を実行する

Windows環境では、以下のように簡単にバッチファイルを起動できます:

subprocess.run("setup_script.bat", shell=True)

.exeファイルも同様です:

subprocess.run("my_app.exe", shell=True)

これらは「ファイル名だけ」指定すればOKですが、**カレントディレクトリ(今いる場所)**にそのファイルがあることが前提です。

パスを含めて指定したいときは、次のように書きます:

subprocess.run(r"C:\Users\YourName\Desktop\setup_script.bat", shell=True)

ここで r をつけているのは、バックスラッシュ(\)をエスケープしない「Raw文字列」にするためです。


🔹 PythonファイルをPythonで実行する

別のPythonスクリプトを実行したいときも、こんなふうに書けばOKです:

subprocess.run(["python", "other_script.py"])

もちろん、Python環境によっては python3 を使う必要があるかもしれません(MacやLinuxではよくあります)。

subprocess.run(["python3", "other_script.py"])

また、仮想環境を使っている場合は、Pythonのパスをフルで指定した方が確実です。


🔹 ファイルパスを扱うときの注意点

  • パスにスペースがある場合は、ダブルクォートで囲むか、リスト形式で渡すと安全です。
  • Windowsなら r"パス" のように Raw文字列にするとバックスラッシュのミスを防げます。
  • MacやLinuxでは / を使うので、Raw文字列は不要です。



5. PowerShellを使いたいとき(Windowsユーザー向け)

Windowsを使っている方は、「コマンドプロンプト」だけでなく「PowerShell」もよく使うかもしれません。subprocessモジュールを使えば、PowerShellのコマンドもPythonから実行できます!


🔹 基本の書き方:powershell -Command

PowerShellのコマンドを実行したいときは、次のように書きます:

subprocess.run('powershell -Command "Get-ChildItem"', shell=True)

これは、PowerShellでいう lsdir にあたる Get-ChildItem コマンドを実行して、現在のフォルダ内のファイル一覧を表示します。


🔹 バックスラッシュやパスの注意点

Windowsではフォルダの区切りに \(バックスラッシュ)を使いますが、これがPythonの文字列と相性が悪いことがあります。たとえば \n\t は改行やタブと解釈されてしまうんですね。

そこで便利なのが、Raw文字列です。r をつけることで、\ をそのまま使えるようになります:

subprocess.run(r'powershell -Command "Get-Content C:\Users\YourName\Documents\log.txt"', shell=True)

これなら、パスの書き間違いによるエラーも防げます。


🔹 PowerShellならではの便利コマンドもOK

PowerShellには、Get-ProcessGet-DateRestart-Computer など、管理者向けの高機能なコマンドがたくさんあります。たとえば現在実行中のプロセス一覧を取得したいときは:

subprocess.run('powershell -Command "Get-Process"', shell=True)

出力をPythonで処理したいときは、これまでと同じように capture_output=True, text=True を加えてください。




6. どんなときに使う?subprocessの活用場面

ここまでで、subprocessモジュールを使えば、Pythonからコマンドを実行できることがわかりました。でも、ちょっと気になるのが「どんなときに使えばいいの?」ということですよね。

実は、Pythonよりコマンドの方が簡単な処理ってけっこうあるんです!


🔹 Pythonだけでは書きづらいことに便利!

たとえば、こんな場面ではsubprocessが大活躍します:

  • 特定のフォルダにアクセス権を設定したいとき
    → PowerShellで1行でできる!
  • 他のアプリやバッチファイルを起動して連携させたいとき
    subprocess.run()でファイルを叩くだけ!
  • サーバーやネットワークに関するシステムコマンドを使いたいとき
    pingipconfignetstatなどが使える!

🔹 Pythonでできるなら、それでもOK!

もちろん、ファイルをコピーしたりフォルダを作ったりといった処理は、Python標準のosモジュールやshutilでも十分にできます。

無理にsubprocessで書く必要はありません。
むしろ、Pythonの機能で完結できるならそっちの方が可読性も高く、安全です。


🔹 コマンドとPythonの「いいとこ取り」がカギ!

最終的には、「Pythonの中でコマンドをちょっと使う」スタイルがベストです。
たとえば:

  • Pythonでファイル一覧を取得して、
  • 条件に合うファイルだけPowerShellで圧縮!

みたいな組み合わせもアリですよね。




まとめ

subprocessモジュールを使うと、Pythonからターミナルやコマンドプロンプトの操作ができるようになります。

基本はこの3ステップでOK!

  1. import subprocessで準備
  2. subprocess.run()でコマンド実行
  3. capture_output=Truetimeout=秒数で柔軟に制御

さらに、PowerShell対応や他のスクリプト実行など、アイデア次第でいろんな応用ができます。

ただし、なんでもかんでもsubprocessでやるのは非効率。Pythonだけでできることは素直にPythonで書き、「コマンドの方が早い・簡単」なときだけ頼るのがポイントです。

Pythonとコマンドの“いいとこ取り”で、自分だけの便利ツールを作ってみてくださいね!


あわせて読みたい

Pythonでコマンド操作や自動化に関連する記事もチェックしてみてください!


よくある質問(Q&A)

Q
subprocess.run()os.system()の違いは?
A

os.system()はコマンドの終了コードしか取得できませんが、subprocess.run()なら出力・エラー・終了コードなどをすべて取得できます。安全性や柔軟性の面でもsubprocessの使用が推奨されます。

Q
shell=Trueは危険なの?
A

ユーザー入力をそのままコマンドとして渡すとコマンドインジェクションの危険があります。信頼できる文字列しか渡さないようにするか、shell=False(リスト形式)を使うのが安全です。

Q
MacとWindowsで違いはありますか?
A

あります。特にコマンドの内容(例:dirはWindowsのみ)やファイルパスの書き方に注意が必要です。Mac/Linuxではls/Users/...など、OSに合ったコマンドや書き方を使いましょう。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク