Python サブプロセスのキャプチャ出力

Salman Mehmood 2023年10月12日
  1. Python サブプロセスのキャプチャ出力
  2. アプローチ 1: check_output を使用して Python で subprocess の出力をキャプチャする
  3. アプローチ 2: Popen.communicate を使用して Python で subprocess の出力をキャプチャする
Python サブプロセスのキャプチャ出力

この記事の主な目的は、サブプロセス の出力を 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つは、stdoutstderr の両方を目的の変数にリダイレクトできることです。

Popenstdoutstderr のタプルを返すように機能するため、[0] にアクセスすると、stdout を取得するだけです。 text, err = pipe.communicate() を実行することもできます。そうすれば、text に必要なものが含まれます。

check_output と同様に、Popen.communicate() もバイト文字列を返します。これは、互換性のある適切なエンコード方式を decode メソッドに渡した後、decode メソッドを使用して通常の文字列に簡単に変換できます。

著者: Salman Mehmood
Salman Mehmood avatar Salman Mehmood avatar

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

関連記事 - Python Subprocess