os.systemとは
os.system
はPythonの標準ライブラリos
に含まれる関数で、シェルコマンドを実行するためのものです。この関数は引数として渡された文字列をシェルコマンドとして実行し、その結果を返します。
以下に簡単な使用例を示します:
import os
# 'ls'コマンドを実行
os.system('ls')
このコードはカレントディレクトリの内容をリスト表示します。os.system
はコマンドの終了ステータスを返すことに注意してください。これはコマンドが正常に終了したかどうかを示します。
しかし、os.system
は古い関数であり、現在ではより強力で柔軟性のあるsubprocess
モジュールが推奨されています。subprocess
はos.system
よりも詳細な制御を提供し、より安全な方法でシェルコマンドを実行することができます。次のセクションでは、subprocess
の基本的な使い方について説明します。
subprocessの登場
Pythonのsubprocess
モジュールは、新しいプロセスを生成し、そのプロセスの入出力を扱い、その終了コードを取得するための強力な手段を提供します。これは、Pythonからシェルコマンドを実行するための推奨される方法です。
subprocess
はos.system
とos.spawn*
の代替として導入されました。これらの関数はシェルコマンドを実行するための基本的な手段を提供していましたが、subprocess
はそれらよりもはるかに強力で柔軟性があります。
subprocess
モジュールは、プロセスの生成、標準入出力の接続、エラーハンドリングなど、プロセス管理に関連する多くのタスクを扱うことができます。これにより、Pythonプログラムはシェルスクリプトのように振る舞うことができ、また、他のプログラムとの間でデータをパイプすることも可能になります。
次のセクションでは、subprocess
の基本的な使い方について詳しく説明します。このモジュールの使用方法を理解することで、PythonからOSコマンドをより効果的に扱うことができるようになります。
subprocessの基本的な使い方
Pythonのsubprocess
モジュールは、新しいプロセスを生成し、そのプロセスの入出力を扱い、その終了コードを取得するための強力な手段を提供します。以下に基本的な使用例を示します:
import subprocess
# 'ls'コマンドを実行
subprocess.run(['ls'])
このコードはカレントディレクトリの内容をリスト表示します。subprocess.run
はCompletedProcess
インスタンスを返します。これには、コマンドの終了ステータス(returncode
)、標準出力(stdout
)、標準エラー出力(stderr
)などの情報が含まれています。
subprocess.run
関数の引数はリスト形式で指定します。これは、シェルがコマンドラインを解析するのではなく、Pythonがそれを行うためです。これにより、シェルの特殊文字(ワイルドカード、パイプ、リダイレクトなど)を気にすることなくコマンドを実行できます。
また、subprocess.run
には様々なオプションがあります。例えば、stdout
やstderr
をキャプチャするためのcapture_output
、コマンドのタイムアウトを設定するためのtimeout
などがあります。これらの詳細については次のセクションで説明します。
subprocess.runの詳細
Pythonのsubprocess.run
関数は、新しいプロセスを生成し、そのプロセスの入出力を扱い、その終了コードを取得するための強力な手段を提供します。以下に詳細な使用例を示します:
import subprocess
# 'ls'コマンドを実行し、標準出力と標準エラー出力をキャプチャ
result = subprocess.run(['ls'], capture_output=True, text=True)
# 結果を表示
print('returncode:', result.returncode)
print('stdout:', result.stdout)
print('stderr:', result.stderr)
このコードはカレントディレクトリの内容をリスト表示し、その結果をキャプチャします。subprocess.run
はCompletedProcess
インスタンスを返します。これには、コマンドの終了ステータス(returncode
)、標準出力(stdout
)、標準エラー出力(stderr
)などの情報が含まれています。
subprocess.run
関数のcapture_output
オプションをTrue
に設定すると、標準出力と標準エラー出力がキャプチャされます。これらの出力はCompletedProcess
インスタンスのstdout
およびstderr
属性からアクセスできます。
また、text
オプションをTrue
に設定すると、出力はバイト列ではなく文字列として扱われます。
subprocess.run
には他にも様々なオプションがあります。例えば、input
オプションを使用すると、標準入力を提供することができます。また、timeout
オプションを使用すると、コマンドのタイムアウトを設定することができます。
これらのオプションを適切に使用することで、PythonからOSコマンドをより効果的に扱うことができます。次のセクションでは、例外処理とsubprocess
の関連性について説明します。
例外処理とsubprocess
Pythonのsubprocess
モジュールを使用する際には、例外処理が重要な役割を果たします。特に、subprocess.run
関数は、コマンドの実行が失敗した場合に例外を発生させることができます。
以下に例を示します:
import subprocess
try:
# 'ls /nonexistent'コマンドを実行
subprocess.run(['ls', '/nonexistent'], check=True)
except subprocess.CalledProcessError as e:
print(f'コマンドが失敗しました: {e.returncode}')
このコードは存在しないディレクトリ/nonexistent
の内容をリスト表示しようとします。subprocess.run
関数のcheck
オプションをTrue
に設定すると、コマンドの実行が失敗した(つまり、終了ステータスが0でない)場合にCalledProcessError
例外が発生します。
この例外はtry/except
ブロックで捕捉できます。CalledProcessError
オブジェクトは、コマンドの終了ステータス(returncode
)、標準出力(stdout
)、標準エラー出力(stderr
)などの情報を含んでいます。
このように、subprocess
モジュールと例外処理を組み合わせることで、PythonからOSコマンドをより安全に、かつ効果的に扱うことができます。これにより、コマンドの実行結果に基づいて適切なエラーハンドリングを行うことが可能になります。この知識を活用して、Pythonでのシェルコマンドの扱い方をさらに理解し、効果的に利用してください。