Python 하위 프로세스 캡처 출력

Salman Mehmood 2023년10월12일
  1. Python 하위 프로세스 캡처 출력
  2. 접근법 1: Python에서 check_output을 사용하여 subprocess의 출력 캡처
  3. 접근법 2: Popen.communicate를 사용하여 Python에서 subprocess의 출력 캡처
Python 하위 프로세스 캡처 출력

이 기사의 주요 목표는 Python에서 하위 프로세스의 출력을 캡처, 저장 및 표시하는 방법을 보여주는 것입니다.

Python 하위 프로세스 캡처 출력

Subprocess는 Python의 설치 파일과 함께 사전 설치되어 제공되는 내장 Python 모듈입니다. 주어진 작업(전달된 내용에 따라)이 해당 프로세스와 별도로 실행되는 새 프로세스를 생성하여 새 코드 및 응용 프로그램을 실행하는 데 사용됩니다.

Subprocess 사용의 주요 이점 중 하나는 현재 작성한 프로그램에서 새 프로그램을 시작할 수 있다는 것입니다.

이러한 프로그램을 실행하는 예는 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;
}

독립적으로 실행되는 공개는 다음과 같은 결과를 제공합니다.

피라미드

이제 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: Python에서 check_output을 사용하여 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의 주요 이점 중 하나는 stdoutstderr를 모두 원하는 변수로 리디렉션할 수 있다는 것입니다.

Popenstdoutstderr의 튜플을 반환하므로 [0]에 액세스할 때 stdout을 가져오는 것입니다. text, err = pipe.communicate()를 수행하면 text에 필요한 내용이 포함됩니다.

check_output과 마찬가지로 Popen.communicate()도 호환 가능하고 적합한 인코딩 체계를 decode 메서드에 전달한 후 decode 메서드를 사용하여 일반 문자열로 쉽게 변환할 수 있는 바이트 문자열을 반환합니다.

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