Python 하위 프로세스 캡처 출력
- Python 하위 프로세스 캡처 출력
-
접근법 1: Python에서
check_output
을 사용하여subprocess
의 출력 캡처 -
접근법 2:
Popen.communicate
를 사용하여 Python에서subprocess
의 출력 캡처
이 기사의 주요 목표는 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
의 주요 이점 중 하나는 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