Python サブプロセスのキャプチャ出力
- Python サブプロセスのキャプチャ出力
-
アプローチ 1:
check_output
を使用して Python でsubprocess
の出力をキャプチャする -
アプローチ 2:
Popen.communicate
を使用して Python でsubprocess
の出力をキャプチャする
この記事の主な目的は、サブプロセス
の出力を Python でキャプチャ、保存、および表示する方法を示すことです。
Python サブプロセスのキャプチャ出力
Subprocess
は組み込みの Python モジュールで、Python のインストール ファイルがプリインストールされています。 指定されたタスク (渡されたものに従って) がそのプロセスとは別に実行される新しいプロセスを作成することにより、新しいコードとアプリケーションを実行するために使用されます。
Subprocess
を使用する主な利点の 1つは、現在作成しているプログラムから新しいプログラムを起動できることです。
このようなプログラムを実行する例としては、Git リポジトリからプロジェクトを複製する場合や、特定のタスクを実行する C++ コンパイラ バイナリを実行する場合があります。
以下のコードの C++ で書かれたプログラムを実行したいとします。
#include <iostream>
using namespace std;
int main() {
int rows = 5, count = 0, count1 = 0, k = 0;
for (int i = 1; i <= rows; ++i) {
for (int space = 1; space <= rows - i; ++space) {
cout << " ";
++count;
}
while (k != 2 * i - 1) {
if (count <= rows - 1) {
cout << i + k << " ";
++count;
}
else {
++count1;
cout << i + k - 2 * count1 << " ";
}
++k;
}
count1 = count = k = 0;
cout << endl;
}
return 0;
}
どの open を独立して実行すると、次の出力が得られます。
次に、Python を使用して記述されたプログラムのコンパイル済みバイナリ ファイルを実行します。
import subprocess
p2 = subprocess.Popen("program\\pyramid.exe")
print(p2)
出力:
<Popen: returncode: None args: '....\\program\\pyramid.exe>
1
2 3 2
3 4 5 4 3
4 5 6 7 6 5 4
5 6 7 8 9 8 7 6 5
上記のコードに見られるように、文字列を取得する代わりに、Popen
のインスタンスを取得することは明らかです。これは、出力に対して処理を実行するために文字列の出力が必要なため、理想的なケースではありません。 他の目的のために。
表示されるピラミッド出力は、p2
という名前の変数を出力した結果ではなく、Popen
を使用して実行されたプログラムの出力であることに注意する必要があります。
この問題には複数の方法で対処できますが、その一部を以下で説明します。
アプローチ 1: check_output
を使用して Python で subprocess
の出力をキャプチャする
次のコードを検討してください。
from subprocess import check_output
out = check_output(["program\\pyramid.exe"])
print(out)
出力:
b' 1 \r\n 2 3 2 \r\n 3 4 5 4 3 \r\n 4 5 6 7 6 5 4 \r\n5 6 7 8 9 8 7 6 5 \r\n'
出力はバイト形式で、decode()
関数を使用して簡単に文字列に変換できます。
print(out.decode("utf-8"))
出力:
これは、out
という名前の文字列変数の目的の出力です。
check_output()
関数は目的のコマンドを実行し、実行されたプログラムのコマンドの出力をバイト文字列の形式で返します。
次に、decode()
メソッドを使用して、バイト文字列を通常の文字列に変換できます。 decode()
パラメータへのエンコード パラメータは、出力タイプによって異なります。
私たちの場合は utf-8
でしたが、プログラムやオペレーティング システムによって異なる場合があります。
アプローチ 2: Popen.communicate
を使用して Python で subprocess
の出力をキャプチャする
次のコードを検討してください。
import subprocess
pipe = subprocess.Popen("\\program\\pyramid.exe", stdout=subprocess.PIPE)
text = pipe.communicate()[0]
print(text)
出力:
b' 1 \r\n 2 3 2 \r\n 3 4 5 4 3 \r\n 4 5 6 7 6 5 4 \r\n5 6 7 8 9 8 7 6 5 \r\n'
前と同様に、decode()
関数を使用して簡単に返すことができるバイト文字列が返されます。
print(text.decode("utf-8"))
出力:
check_output
を使用する代わりに、Popen.communicate()
メソッドを使用することもできます。check_output
の主な利点の 1つは、stdout
と stderr
の両方を目的の変数にリダイレクトできることです。
Popen
が stdout
と stderr
のタプルを返すように機能するため、[0]
にアクセスすると、stdout
を取得するだけです。 text, err = pipe.communicate()
を実行することもできます。そうすれば、text
に必要なものが含まれます。
check_output
と同様に、Popen.communicate()
もバイト文字列を返します。これは、互換性のある適切なエンコード方式を decode
メソッドに渡した後、decode
メソッドを使用して通常の文字列に簡単に変換できます。
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn