CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
みなさん、こんにちは。
ネットワーク自動化に役立つPythonのモジュールやライブラリの一つとして、subprocess ライブラリを紹介しました。subprocess ライブラリを使うと、Pythonスクリプトから外部プロセスを実行し、そのプロセスの入出力を制御できます。
前回は、その subprocess ライブラリの run 関数を紹介しました。run 関数は、Pythonのスクリプトから外部プロセスを実行し、そのプロセスの結果を取得するものです。外部プロセスの実行をシンプルに扱うように設計されており、プロセスの実行、終了コードの確認、標準出力およびエラー出力の取得などを一括して行えます。subprocess.run では外部プロセスを同期的に実行するため、プロセスが終了するまで次の処理に進むことはできません。
今回は、subprocess ライブラリを使用した非同期処理について説明します。プロセスの終了を待たずに複数のプロセスを同時に実行する方法です。
非同期処理は、複数のプロセスを同時に実行し、待機せずに他のタスクを実行できるため、効率的なネットワーク自動化に不可欠です。非同期処理を実現するには、subprocess ライブラリのsubprocess.Popen クラスを使用します。このクラスを使うことで、複数のプロセスを非同期に実行できます。非同期処理を行う基本的な手順は以下です。
以下は、実際のプログラム例です。この例では、subprocess.Popen を使用して3つの異なるコマンドを非同期に実行しています。各プロセスの完了を待つために、communicate メソッドを使用し、それぞれのプロセスの終了コードを確認しています。
import subprocess
# コマンドをリストで指定
commands = [
["command1", "arg1", "arg2"],
["command2", "arg1"],
["command3"]
]
# プロセスを格納するリスト
processes = []
# 1. 各コマンドを非同期で実行
for cmd in commands:
process = subprocess.Popen(cmd,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
processes.append(process)
# 2. 各プロセスの完了を待つ
for process in processes:
stdout, stderr = process.communicate()
if process.returncode == 0:
print(f"成功: {stdout.decode()}")
else:
print(f"エラー: {stderr.decode()}")
このプログラムについてもう少し解説しましょう。
今回は、subprocess ライブラリの Popen を紹介しました。
Popenとrunの違いは以下です。
どちらを選択すべきかは、用途によります。もし外部プロセスを非同期で実行し、その標準入出力を制御したり、何度も非同期で実行したりする必要がある場合は、Popen を使用すればよいでしょう。一方で、シンプルに外部コマンドを実行して結果を取得したいだけであれば、run 関数が使いやすいかもしれません。
次回は、telnetlibライブラリを紹介します。次回もお楽しみに。
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes