[Python]Windowsのos.systemを活用 !標準出力の取得と終了待ち

Pythonには、外部プログラムを実行するためのosモジュールがあります。os.systemはそのモジュールの一つで、外部プログラムを実行することができます。この記事では、特にWindows環境でのos.systemの使用方法について解説します。

Windows環境でのos.systemの使用方法

Windows環境では、os.systemを使うことで、コマンドプロンプトやPowerShellなどのコマンドラインツールを呼び出すことができます。

import os
# コマンドプロンプトを開く
os.system('cmd')
# PowerShellを開く
os.system('powershell')

上記の例では、os.systemを使ってcmdやpowershellを開いています。このように、os.systemを使うことで、Windows環境で実行できるプログラムを呼び出すことができます。

os.systemの基本的な機能と仕組み

os.systemは、引数に渡されたコマンドを実行します。実行したコマンドが終了すると、その終了ステータスが返されます。終了ステータスは、0以外の場合はエラーが発生したことを示します。

また、os.systemは、子プロセスを作成してコマンドを実行します。子プロセスが終了するまで、親プロセスは待機します。

os.systemでプロセスの終了を待つ方法

os.systemで実行したプロセスが終了するまで待機する方法は、subprocessモジュールを使うことです。subprocessモジュールには、プロセスを実行するためのPopen関数があります。Popen関数を使うことで、プロセスの実行と終了を待つことができます。

import subprocess
# pingコマンドを実行する
process = subprocess.Popen(['ping', '127.0.0.1'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# プロセスの終了を待つ
stdout, stderr = process.communicate()
print(stdout.decode('utf-8'))

上記の例では、subprocess.Popenを使ってpingコマンドを実行し、プロセスの終了を待っています。stdoutとstderrには、それぞれ標準出力と標準エラー出力が格納されます。communicate関数を使うことで、プロセスの終了を待ち、実行結果を取得することができます。

os.systemで標準出力を取得する方法

os.systemでコマンドを実行した場合、標準出力を取得することはできません。標準出力を取得するには、subprocessモジュールを使う必要があります。

import subprocess
# pingコマンドを実行する
process = subprocess.Popen(['ping', '127.0.0.1'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
# 標準出力を取得する
stdout, stderr = process.communicate()
print(stdout.decode('utf-8'))

上記の例では、subprocess.Popenを使ってpingコマンドを実行し、標準出力を取得しています。stdoutには、標準出力が格納されます。communicate関数を使うことで、プロセスの終了を待ち、標準出力を取得することができます。

os.systemの活用例

os.systemを活用することで、Windows環境で実行できるコマンドラインツールを使った処理をPythonで実行することができます。

例えば、以下のように、Windowsのコマンドラインツールであるrobocopyを使って、ファイルのバックアップを行うことができます。

import os
# バックアップ元のディレクトリ
src_dir = 'C:\\Users\\user\\Documents'
# バックアップ先のディレクトリ
dst_dir = 'D:\\backup'
# robocopyコマンドを実行する
os.system(f'robocopy "{src_dir}" "{dst_dir}" /e /xo /tee /log+:log.txt')

上記の例では、robocopyコマンドを使って、src_dirのディレクトリをdst_dirにバックアップしています。/eオプションは、サブディレクトリも含めてコピーすることを示します。/xoオプションは、更新日時が古いファイルのみをコピーすることを示します。/teeオプションは、標準出力とlog.txtにログを出力することを示します。

まとめ

os.systemを使うことで、PythonからWindows環境で実行できるコマンドラインツールを呼び出すことができます。プロセスの終了を待つ方法や標準出力を取得する方法を使いこなすことで、さまざまな処理をPythonで実現することができます。