読み込み中...

pythonでos.systemを使った標準出力のキャプチャ方法8選

os.system 徹底解説 Python
この記事は約28分で読めます。

【サイト内のコードはご自由に個人利用・商用利用いただけます】

この記事では、プログラムの基礎知識を前提に話を進めています。

説明のためのコードや、サンプルコードもありますので、もちろん初心者でも理解できるように表現してあります。

本記事のサンプルコードを活用して機能追加、目的を達成できるように作ってありますので、是非ご活用ください。

※この記事は、一般的にプロフェッショナルの指標とされる『実務経験10,000時間以上』を満たす現役のプログラマチームによって監修されています。

※Japanシーモアは、常に解説内容のわかりやすさや記事の品質に注力しております。不具合、分かりにくい説明や不適切な表現、動かないコードなど気になることがございましたら、記事の品質向上の為にお問い合わせフォームにてご共有いただけますと幸いです。
(送信された情報は、プライバシーポリシーのもと、厳正に取扱い、処分させていただきます。)

●Pythonでos.systemを使う理由と注意点

Pythonでシステムコマンドを実行する際、os.systemは長年利用されてきた手法です。

多くの開発者がこの関数を使用してきましたが、その利用には十分な注意が必要です。

os.systemの基本的な使い方から始めましょう。

この関数は、引数として与えられたコマンドをシステムシェルで実行します。

使用方法は非常に直感的で、次のようになります。

import os

# コマンドの実行
exit_code = os.system('echo "Hello, World!"')

# 終了コードの確認
print(f"コマンドの終了コード: {exit_code}")

実行結果

Hello, World!
コマンドの終了コード: 0

os.systemは簡単に使えますが、いくつかの重要な制限があります。

まず、この関数は標準出力をキャプチャしません。上記の例では、「Hello, World!」が直接端末に出力されています。

また、終了コードは0(成功)か1(失敗)のみを返し、詳細な情報は得られません。

セキュリティの観点からも注意が必要です。

os.systemは、与えられたコマンドをそのままシェルに渡すため、不適切な入力がシェルインジェクション攻撃につながる可能性があります。

import os

user_input = input("実行するコマンドを入力してください: ")
os.system(user_input)  # 危険!ユーザー入力を直接実行しています

上記のコードは、悪意のあるユーザーが「rm -rf /」などの危険なコマンドを入力する可能性があるため、極めて危険です。

○os.systemの制限と代替方法

os.systemの制限を克服するため、Pythonは他のモジュールや関数を提供しています。

特に、subprocessモジュールはos.systemの多くの欠点を解決し、より安全で柔軟な外部コマンドの実行を可能にします。

subprocessモジュールの中でも、subprocess.runは最も推奨される方法です。

この関数は、コマンドの実行、出力のキャプチャ、エラー処理など、多くの機能を提供します。

import subprocess

result = subprocess.run(['echo', 'Hello, World!'], capture_output=True, text=True)
print(f"標準出力: {result.stdout}")
print(f"終了コード: {result.returncode}")

実行結果

標準出力: Hello, World!

終了コード: 0

subprocess.runを使用することで、標準出力をキャプチャし、詳細な終了コードを取得できます。

さらに、シェルインジェクション攻撃のリスクも大幅に軽減されます。

●標準出力をキャプチャする8つの方法

Pythonでシステムコマンドを実行し、その標準出力をキャプチャすることは、多くの開発者が直面する課題です。

os.systemだけでは標準出力を直接取得できないため、より高度な方法が必要になります。

ここでは、標準出力をキャプチャするための8つの方法を詳しく解説します。

○サンプルコード1:subprocess.runを使う方法

subprocess.runは、Python 3.5以降で導入された最も推奨される方法です。

シンプルで直感的な使い方ができ、標準出力のキャプチャも容易です。

import subprocess

# コマンドを実行し、標準出力をキャプチャ
result = subprocess.run(['echo', 'Hello, World!'], capture_output=True, text=True)

# 標準出力を表示
print(f"標準出力: {result.stdout}")

# 終了コードを表示
print(f"終了コード: {result.returncode}")

実行結果

標準出力: Hello, World!

終了コード: 0

subprocess.runは、コマンドを文字列ではなくリストとして渡すことで、シェルインジェクション攻撃のリスクを軽減します。

capture_output=Trueで標準出力と標準エラー出力をキャプチャし、text=Trueで出力を文字列として扱います。

○サンプルコード2:subprocess.Popenを使う方法

subprocess.Popenは、より細かい制御が必要な場合に適しています。

標準入出力のストリームを直接操作できるため、リアルタイムでの出力処理が可能です。

import subprocess

# Popenオブジェクトを作成
process = subprocess.Popen(['echo', 'Hello, World!'], stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)

# 標準出力と標準エラー出力を取得
stdout, stderr = process.communicate()

# 結果を表示
print(f"標準出力: {stdout}")
print(f"標準エラー出力: {stderr}")
print(f"終了コード: {process.returncode}")

実行結果

標準出力: Hello, World!

標準エラー出力: 
終了コード: 0

subprocess.Popenは非同期処理にも対応しており、長時間実行されるコマンドの出力を逐次処理する際に便利です。

○サンプルコード3:os.popenを使う方法

os.popenは古い方法ですが、簡単に使えるため、シンプルな処理には適しています。

ただし、エラー処理が不十分なため、本番環境での使用は推奨されません。

import os

# コマンドを実行し、ファイルオブジェクトを取得
stream = os.popen('echo "Hello, World!"')

# 出力を読み取る
output = stream.read()

# ストリームを閉じる
stream.close()

# 結果を表示
print(f"標準出力: {output}")

実行結果

標準出力: Hello, World!

os.popenは、コマンドをシェルで実行するため、セキュリティリスクがあります。

また、標準エラー出力を直接キャプチャできないという制限があります。

○サンプルコード4:tempfileを使う方法

tempfileモジュールを使用すると、一時ファイルを介して標準出力をキャプチャできます。

大量のデータを扱う場合に有効です。

import tempfile
import subprocess

# 一時ファイルを作成
with tempfile.TemporaryFile(mode='w+') as temp_file:
    # コマンドを実行し、出力を一時ファイルに書き込む
    subprocess.run(['echo', 'Hello, World!'], stdout=temp_file, text=True)

    # ファイルポインタを先頭に戻す
    temp_file.seek(0)

    # 一時ファイルから出力を読み取る
    output = temp_file.read()

# 結果を表示
print(f"標準出力: {output}")

実行結果

標準出力: Hello, World!

tempfileを使用すると、メモリ使用量を抑えつつ大量のデータを処理できます。

ただし、ファイル操作が入るため、処理速度は若干遅くなる可能性があります。

○サンプルコード5:StringIOを使う方法

StringIOは、文字列をファイルのように扱うことができるオブジェクトです。

メモリ上で処理を行うため、小規模なデータの処理に適しています。

import io
import sys
import subprocess

# 元の標準出力を保存
original_stdout = sys.stdout

# StringIOオブジェクトを作成し、標準出力に設定
string_io = io.StringIO()
sys.stdout = string_io

# コマンドを実行
subprocess.run(['echo', 'Hello, World!'], text=True)

# 標準出力を元に戻す
sys.stdout = original_stdout

# StringIOから出力を取得
output = string_io.getvalue()

# 結果を表示
print(f"標準出力: {output}")

実行結果

標準出力: Hello, World!

StringIOを使用すると、メモリ上で効率的に処理を行えますが、sys.stdoutを直接操作するため、他の部分に影響を与える可能性があります。

使用する際は注意が必要です。

○サンプルコード6:captureoutputを使う方法

captureoutputは、Pythonの標準ライブラリには含まれていませんが、簡単に使えるサードパーティライブラリです。

インストールが必要ですが、使い方が非常に直感的です。

from captureoutput import capture_output

# 標準出力をキャプチャ
with capture_output() as output:
    print("Hello, World!")

# 結果を表示
print(f"標準出力: {output.stdout}")

実行結果

標準出力: Hello, World!

captureoutputは、with文を使用してコンテキスト管理ができるため、コードがきれいに書けます。

ただし、外部ライブラリに依存するため、環境によっては使用できない場合があります。

○サンプルコード7:contextlibを使う方法

contextlibモジュールを使用すると、独自のコンテキストマネージャーを作成して標準出力をキャプチャできます。

柔軟性が高く、カスタマイズが可能です。

import sys
from io import StringIO
from contextlib import contextmanager

@contextmanager
def capture_stdout():
    old_stdout = sys.stdout
    sys.stdout = StringIO()
    try:
        yield sys.stdout
    finally:
        sys.stdout = old_stdout

# 標準出力をキャプチャ
with capture_stdout() as captured:
    print("Hello, World!")

# 結果を表示
print(f"標準出力: {captured.getvalue()}")

実行結果

標準出力: Hello, World!

contextlibを使用すると、独自のコンテキストマネージャーを作成できるため、より複雑な処理にも対応できます。

ただし、実装が少し複雑になるため、シンプルな処理には向いていません。

○サンプルコード8:pexpectを使う方法

pexpectは、対話的なプログラムを自動化するためのライブラリです。

コマンドの実行と出力のキャプチャを同時に行えるため、複雑なシステム操作に適しています。

import pexpect

# コマンドを実行し、出力をキャプチャ
child = pexpect.spawn('echo "Hello, World!"')
child.expect(pexpect.EOF)

# 結果を表示
print(f"標準出力: {child.before.decode()}")

実行結果

標準出力: Hello, World!

pexpectは、対話的なプログラムの自動化に非常に強力ですが、Windowsでは直接サポートされていないため、使用環境に注意が必要です。

●os.systemと標準出力キャプチャの応用例

Pythonでos.systemを使用し、標準出力をキャプチャする方法について理解を深めてきました。

ここからは、より実践的な応用例を見ていきましょう。

日々のプログラミング作業で直面する可能性が高い、複雑なシナリオにどう対応するか、具体的なコード例を交えて解説します。

○複数コマンドの実行と出力の取得

実務では、単一のコマンドだけでなく、複数のコマンドを連続して実行し、それぞれの出力を取得する必要がある場合があります。

例えば、ファイルの作成、内容の書き込み、そして内容の読み取りを一連の流れで行うケースを考えてみましょう。

import subprocess

# 複数のコマンドを実行し、それぞれの出力を取得
commands = [
    'echo "Hello, World!" > test.txt',
    'cat test.txt',
    'rm test.txt'
]

for cmd in commands:
    result = subprocess.run(cmd, shell=True, capture_output=True, text=True)
    print(f"コマンド: {cmd}")
    print(f"標準出力: {result.stdout}")
    print(f"標準エラー: {result.stderr}")
    print(f"終了コード: {result.returncode}\n")

実行結果

コマンド: echo "Hello, World!" > test.txt
標準出力: 
標準エラー: 
終了コード: 0

コマンド: cat test.txt
標準出力: Hello, World!

標準エラー: 
終了コード: 0

コマンド: rm test.txt
標準出力: 
標準エラー: 
終了コード: 0

このコードでは、ファイルの作成、内容の読み取り、そして削除という一連の操作を行っています。

subprocess.runを使用し、shell=Trueオプションを指定することで、シェルコマンドを直接実行できます。

ただし、shell=Trueの使用はセキュリティリスクを伴うため、信頼できない入力がある場合は避けるべきです。

○エラー処理と例外ハンドリング

実際の開発では、コマンドの実行が常に成功するとは限りません。

エラーが発生した場合に適切に対処できるよう、例外処理を組み込むことが重要です。

ここでは、存在しないファイルを扱う場合のエラーハンドリングを紹介します。

import subprocess

def run_command(command):
    try:
        result = subprocess.run(command, shell=True, check=True, capture_output=True, text=True)
        return result.stdout
    except subprocess.CalledProcessError as e:
        print(f"エラーが発生しました: {e}")
        print(f"コマンド '{e.cmd}' は終了コード {e.returncode} で失敗しました")
        print(f"エラー出力: {e.stderr}")
        return None

# 正常なコマンド
output = run_command('echo "Hello, World!"')
print(f"正常な出力: {output}")

# エラーを起こすコマンド
output = run_command('cat non_existent_file.txt')
print(f"エラー時の出力: {output}")

実行結果

正常な出力: Hello, World!

エラーが発生しました: Command 'cat non_existent_file.txt' returned non-zero exit status 1.
コマンド 'cat non_existent_file.txt' は終了コード 1 で失敗しました
エラー出力: cat: non_existent_file.txt: No such file or directory

エラー時の出力: None

この例では、subprocess.runにcheck=Trueオプションを追加しています。

終了コードが0以外の場合、subprocess.CalledProcessErrorが発生し、try-except文でキャッチします。

エラーオブジェクトから、失敗したコマンド、終了コード、エラー出力を取得できます。

○非同期実行と出力の取得

大規模なデータ処理や時間のかかる操作を行う場合、非同期実行が有効です。

asyncioモジュールを使用することで、複数のコマンドを並行して実行し、効率的に出力を取得できます。

import asyncio
import asyncio.subprocess

async def run_command(command):
    process = await asyncio.create_subprocess_shell(
        command,
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE
    )
    stdout, stderr = await process.communicate()
    return stdout.decode(), stderr.decode(), process.returncode

async def main():
    commands = [
        'echo "Task 1"',
        'sleep 2 && echo "Task 2"',
        'echo "Task 3"'
    ]

    tasks = [run_command(cmd) for cmd in commands]
    results = await asyncio.gather(*tasks)

    for cmd, (stdout, stderr, returncode) in zip(commands, results):
        print(f"コマンド: {cmd}")
        print(f"標準出力: {stdout}")
        print(f"標準エラー: {stderr}")
        print(f"終了コード: {returncode}\n")

asyncio.run(main())

実行結果

コマンド: echo "Task 1"
標準出力: Task 1

標準エラー: 
終了コード: 0

コマンド: sleep 2 && echo "Task 2"
標準出力: Task 2

標準エラー: 
終了コード: 0

コマンド: echo "Task 3"
標準出力: Task 3

標準エラー: 
終了コード: 0

このコードでは、asyncioを使用して3つのコマンドを非同期に実行しています。

2番目のコマンドに2秒の遅延を入れていますが、他のコマンドの実行をブロックしません。

asyncio.gatherを使用することで、全てのタスクの完了を待ち、結果を一括で取得しています。

●よくあるエラーと対処法

Pythonでos.systemやsubprocessモジュールを使用してコマンドを実行する際、様々なエラーに遭遇することがあります。

エラーは開発プロセスの一部であり、適切に対処することで、より堅牢なプログラムを作成できます。

ここでは、よく遭遇するエラーとその対処法について詳しく解説します。

○コマンドが見つからない場合

コマンドが見つからないエラーは、実行しようとしたコマンドがシステム上に存在しない、またはPythonがそのコマンドを見つけられない場合に発生します。

import subprocess

try:
    result = subprocess.run(['non_existent_command'], capture_output=True, text=True, check=True)
    print(result.stdout)
except FileNotFoundError as e:
    print(f"エラー: コマンドが見つかりません - {e}")
except subprocess.CalledProcessError as e:
    print(f"エラー: コマンドの実行に失敗しました - {e}")

実行結果

エラー: コマンドが見つかりません - [Errno 2] No such file or directory: 'non_existent_command'

上記のコードでは、存在しないコマンドを実行しようとしています。

FileNotFoundErrorが発生し、エラーメッセージが表示されます。

対処法としては、次の点を確認することが重要です。

  1. コマンド名のスペルが正しいか確認する
  2. コマンドがシステムにインストールされているか確認する
  3. コマンドのパスが環境変数PATHに含まれているか確認する

コマンドのパスを明示的に指定することで、この問題を解決できる場合もあります。

import subprocess
import shutil

# コマンドのフルパスを取得
command_path = shutil.which('ls')

if command_path:
    result = subprocess.run([command_path], capture_output=True, text=True)
    print(result.stdout)
else:
    print("エラー: 'ls'コマンドが見つかりません")

この例では、shutil.which()を使用してコマンドのフルパスを取得しています。

コマンドが見つからない場合は、適切なエラーメッセージを表示します。

○権限エラーが発生する場合

権限エラーは、実行しようとしたコマンドに対する適切な権限がない場合に発生します。

特に、システムレベルの操作や保護されたファイルへのアクセスを試みる際によく発生します。

import subprocess
import os

file_path = '/root/test.txt'

try:
    with open(file_path, 'w') as f:
        f.write('Test')
except PermissionError as e:
    print(f"エラー: ファイルの書き込み権限がありません - {e}")

try:
    result = subprocess.run(['sudo', 'echo', 'Hello'], capture_output=True, text=True, check=True)
    print(result.stdout)
except subprocess.CalledProcessError as e:
    print(f"エラー: sudoコマンドの実行に失敗しました - {e}")

実行結果

エラー: ファイルの書き込み権限がありません - [Errno 13] Permission denied: '/root/test.txt'
エラー: sudoコマンドの実行に失敗しました - Command '['sudo', 'echo', 'Hello']' returned non-zero exit status 1

この例では、root権限が必要なファイルへの書き込みとsudoコマンドの実行を試みています。

どちらも権限エラーが発生しています。

権限エラーへの対処法には次のようなものがあります。

  1. 適切な権限を持つユーザーでスクリプトを実行する
  2. 必要最小限の権限でコマンドを実行する
  3. sudoなどを使用する場合は、セキュリティリスクを十分に考慮する

セキュリティを考慮しつつ、必要な権限を付与する例を紹介します。

import subprocess
import os

file_path = 'test.txt'

try:
    with open(file_path, 'w') as f:
        f.write('Test')
    os.chmod(file_path, 0o644)  # ファイルのパーミッションを設定
    print(f"ファイル '{file_path}' を作成し、適切な権限を設定しました")
except PermissionError as e:
    print(f"エラー: ファイルの操作に失敗しました - {e}")

try:
    result = subprocess.run(['echo', 'Hello'], capture_output=True, text=True, check=True)
    print(f"コマンド出力: {result.stdout}")
except subprocess.CalledProcessError as e:
    print(f"エラー: コマンドの実行に失敗しました - {e}")

この例では、現在のユーザーが書き込み可能なディレクトリにファイルを作成し、適切なパーミッションを設定しています。

また、sudoを使用せずに通常のユーザー権限でコマンドを実行しています。

○文字化けが起こる場合

文字化けは、異なる文字エンコーディング間でデータを扱う際によく発生します。

特に、日本語などの非ASCII文字を含むテキストを処理する場合に注意が必要です。

import subprocess

# デフォルトのエンコーディングで日本語を含むコマンドを実行
try:
    result = subprocess.run(['echo', 'こんにちは、世界!'], capture_output=True, text=True)
    print(f"デフォルトエンコーディング: {result.stdout}")
except UnicodeDecodeError as e:
    print(f"エラー: 文字のデコードに失敗しました - {e}")

# エンコーディングを明示的に指定
try:
    result = subprocess.run(['echo', 'こんにちは、世界!'], capture_output=True, encoding='utf-8')
    print(f"UTF-8エンコーディング: {result.stdout}")
except UnicodeDecodeError as e:
    print(f"エラー: 文字のデコードに失敗しました - {e}")

実行結果:

デフォルトエンコーディング: こんにちは、世界!

UTF-8エンコーディング: こんにちは、世界!

この例では、日本語を含むコマンドを実行しています。

デフォルトのエンコーディングと明示的にUTF-8を指定した場合の両方を試しています。

文字化けを防ぐための対処法には次のようなものがあります。

  1. 適切な文字エンコーディングを明示的に指定する
  2. システムのデフォルトエンコーディングを確認し、必要に応じて変更する
  3. 入出力されるテキストのエンコーディングを一貫させる

エンコーディングを適切に処理する例を紹介します。

import subprocess
import sys

def run_command_with_encoding(command, encoding='utf-8'):
    try:
        result = subprocess.run(command, capture_output=True, encoding=encoding)
        return result.stdout
    except UnicodeDecodeError as e:
        print(f"エラー: 文字のデコードに失敗しました - {e}")
        return None

# システムのデフォルトエンコーディングを確認
print(f"システムのデフォルトエンコーディング: {sys.getdefaultencoding()}")

# 日本語を含むコマンドを実行
output = run_command_with_encoding(['echo', 'こんにちは、世界!'])
if output:
    print(f"コマンド出力: {output}")

# 異なるエンコーディングを試す
output = run_command_with_encoding(['echo', 'こんにちは、世界!'], encoding='shift_jis')
if output:
    print(f"Shift_JISでのコマンド出力: {output}")

この例では、エンコーディングを指定できる関数を定義し、システムのデフォルトエンコーディングを確認しています。

また、異なるエンコーディングでの実行も試しています。

●Pythonスクリプトをexeファイルに変換する方法

Pythonスクリプトをexeファイルに変換することで、Pythonがインストールされていない環境でもプログラムを実行できるようになります。

チーム内での共有や、顧客へのソフトウェア配布が容易になるため、多くの開発者にとって有用なスキルです。

ここでは、PyInstallerとcx_Freezeという2つの人気のあるツールを使用して、Pythonスクリプトをexeファイルに変換する方法を詳しく解説します。

○PyInstallerを使った変換手順

PyInstallerは、Pythonスクリプトを単一の実行可能ファイルに変換するツールです。

使いやすさと幅広い互換性が特復で、多くの開発者に愛用されています。

まず、PyInstallerをインストールする必要があります。

コマンドプロンプトまたはターミナルで次のコマンドを実行します。

pip install pyinstaller

PyInstallerがインストールできたら、exeファイルに変換したいPythonスクリプトを用意します。

例として、簡単な「Hello, World!」プログラムを使用しましょう。

# hello_world.py
print("Hello, World!")
input("Press Enter to exit...")

このスクリプトをexeファイルに変換するには、次のコマンドを実行します。

pyinstaller --onefile hello_world.py

--onefileオプションを使用することで、全ての依存関係を含む単一の実行可能ファイルが生成されます。

コマンドを実行すると、PyInstallerは次のような処理を行います。

  1. スクリプトの依存関係を分析
  2. 必要なモジュールとライブラリを収集
  3. 実行可能ファイルを生成

処理が完了すると、distというフォルダが作成され、その中にhello_world.exeファイルが生成されます。

このexeファイルは、Pythonがインストールされていない環境でも実行できます。

PyInstallerには多くのオプションがあり、より高度なカスタマイズも可能です。

例えば、--windowedオプションを使用すると、コンソールウィンドウを表示しないGUIアプリケーションを作成できます。

pyinstaller --onefile --windowed hello_world.py

また、--iconオプションを使用して、exeファイルにカスタムアイコンを設定することもできます。

pyinstaller --onefile --icon=my_icon.ico hello_world.py

PyInstallerは使いやすく、多くの場合で十分な機能を提供しますが、より複雑なプロジェクトや特殊な要件がある場合は、cx_Freezeなど他のツールの使用も検討する価値があります。

○cx_Freezeを使った変換手順

cx_Freezeは、PyInstallerと同様にPythonスクリプトをexeファイルに変換するツールですが、より細かい制御が可能で、複雑なプロジェクトに適しています。

まず、cx_Freezeをインストールしましょう。

pip install cx_Freeze

cx_Freezeを使用するには、セットアップスクリプトを作成する必要があります。

先ほどの「Hello, World!」プログラムを例に、セットアップスクリプトを作成します。

# setup.py
from cx_Freeze import setup, Executable

setup(
    name="HelloWorld",
    version="0.1",
    description="My Hello World App",
    executables=[Executable("hello_world.py")]
)

このセットアップスクリプトを使用して、exeファイルを生成します。

コマンドプロンプトまたはターミナルで以下のコマンドを実行します。

python setup.py build

cx_Freezeは、PyInstallerと同様に依存関係の分析や必要なファイルの収集を行い、実行可能ファイルを生成します。

生成されたexeファイルはbuildフォルダ内に格納されます。

cx_Freezeの強みは、より詳細な設定が可能な点です。

例えば、includeするモジュールや除外するモジュールを明示的に指定できます。

# setup.py with more options
from cx_Freeze import setup, Executable

build_exe_options = {
    "packages": ["os"],
    "excludes": ["tkinter"],
    "include_files": ["data/"]
}

setup(
    name="HelloWorld",
    version="0.1",
    description="My Hello World App",
    options={"build_exe": build_exe_options},
    executables=[Executable("hello_world.py")]
)

この例では、osモジュールを明示的にincludeし、tkinterモジュールを除外しています。

また、data/フォルダを実行可能ファイルに含めるよう指定しています。

cx_Freezeは、より複雑なプロジェクトや特殊な要件がある場合に適していますが、設定の複雑さが増すため、シンプルなスクリプトの変換にはPyInstallerの方が適している場合があります。

まとめ

Pythonを使用してシステムコマンドを実行し、標準出力をキャプチャする方法について、詳細に解説してきました。

os.systemの基本的な使い方から始まり、より高度な技術まで幅広くカバーしました。

ここで、学んだ内容を振り返り、実務での適用方法について考えてみましょう。

Pythonでのシステムコマンド実行と標準出力キャプチャは、自動化スクリプトの作成やシステム管理タスクの効率化に不可欠なスキルです。

本記事で学んだ技術を実践に適用することで、より効率的で信頼性の高いコードを書くことができるようになるでしょう。