CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
みなさん、こんにちは。
前回のコラムで、ネットワーク自動化に使えそうなPythonのモジュールやライブラリを紹介しました。今回からは、その中からsubprocessライブラリに焦点を当て、詳しく解説していきます。
subprocessライブラリは、Pythonの標準ライブラリで、Pythonから他のプログラムやコマンドを実行するためのモジュールです。例えば、コンピュータ内に保存されているファイルのリストを表示するコマンドや、特定のファイルを開くプログラムなどを、Pythonから直接呼び出して実行することができます。このライブラリを使うと、Pythonから他のプログラムへと簡単に連携することができるので、さまざまなタスクを効率的に実行することができます。
例えば、コンピュータ内に保存されているファイルのリストを表示するコマンドを実行するには、以下のようにします。
LinuxやmacOSの場合
コマンドは ls です。特定のディレクトリの中身を見たい場合は、例えば ls /path/to/directory のように使用します。Pythonから実行する場合は、以下のようにします。
import subprocess
completed_process = subprocess.run([’ls’, ’/path/to/directory’], capture_output=True, text=True)
print(completed_process.stdout)
Windowsの場合
コマンドは dir です。特定のディレクトリの中を見たい場合は、例えば、dir C:¥path¥to¥directory のように使用します。Pythonからの実行例も見てみましょう。Windowsの場合、shell=True を指定してコマンドを発行します。これにより、Windowsのコマンドプロンプトを介してコマンドが実行されるようになります。
import subprocess
completed_process = subprocess.run([’dir’, ’C:¥path¥to¥directory’], capture_output=True, text=True, shell=True)
print(completed_process.stdout)
新しいプロセスを起動して外部コマンドを実行し、その終了まで待つような処理を実行するには、subprocess.run() 関数を使用します。この関数を使うと、システムのシェルコマンドや他の外部プログラムを簡単に実行することができます。
subprocess.run() の第一引数は、実行するコマンドとその引数を含むリストまたは文字列です。
リストで与える
コマンドとその引数を個別の文字列としてリストに格納します。これは最も一般的な使用法で、リストとして引数を指定すると、シェルの特殊文字が誤って解釈されるリスクも低減します。
result = subprocess.run([’ls’, ’-l’, ’/path/to/directory’])
文字列で与える
一連のコマンドと引数を単一の文字列として、引数とする方法です。この場合、shell=True 引数が必要となり、コマンドがシェル経由で実行されることを意味します。ただし、この方法は、外部からのデータを含むコマンドを実行する場合にセキュリティリスクが伴うため、注意が必要です。
result = subprocess.run(’ls -l /path/to/directory’, shell=True)
subprocess.run() は、CompletedProcess インスタンスを返します。このインスタンスは、以下のような属性を持ちます。
subprocess.run() は多くの引数オプションを持っており、これらのオプションを使うと外部コマンドの実行の挙動をカスタマイズすることができます。
stdin
stdout
プロセスの標準出力先を指定します。
stderr
プロセスの標準エラー出力先を指定します。
capture_output=True
コマンドの標準出力と標準エラー出力をキャプチャすることができます。stdoutとstderrをキャプチャするためにsubprocess.PIPE が自動的に使われます。
text=True
出力をバイト列ではなく文字列として取得します。デフォルトでは、subprocess は出力をバイト列として返しますが、text=True を指定することで、人間が読みやすいテキスト形式で出力を取得することができます。
timeout
コマンドの最大実行時間を秒単位で指定します。この時間を超えると、プロセスは中止されます。
check=True
非ゼロの終了コードでコマンドが終了した場合に、CalledProcessError例外を発生させることができます。
以下のコードは、google.com に対して ping コマンドを実行し、その結果を表示するものです。
import subprocess
# ’ping’ コマンドを実行するための引数をリストとして指定
args = [’ping’, ’google.com’, ’-c’, ’4’] # ’-c 4’ はpingを4回
# subprocess.run を使用してコマンドを実行
result = subprocess.run(args, capture_output=True, text=True)
# 実行結果を表示
print(result.stdout)
実行結果は以下のようになります。
PING [google.com](<http://google.com/>) (172.xxx.xxx.110): 56 data bytes
64 bytes from 172.xxx.xxx.110: icmp_seq=0 ttl=58 time=38.181 ms
64 bytes from 172.xxx.xxx.110: icmp_seq=1 ttl=58 time=22.222 ms
64 bytes from 172.xxx.xxx.110: icmp_seq=2 ttl=58 time=13.820 ms
64 bytes from 172.xxx.xxx.110: icmp_seq=3 ttl=58 time=14.963 ms
--- google.com ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 13.820/22.296/38.181/9.721 ms
今回は、subprocessライブラリのrun()関数に焦点を当てて解説しました。この関数を使うと、外部のプログラムやコマンドを簡単に実行できます。次回は、subprocessライブラリを使って非同期処理で複数のプロセスを同時に実行する方法を紹介します。次回もお楽しみに。
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes