HOWTO · Python
Python의 Subprocess.check_output
이 자습서에서는 Git 명령 실행에 중점을 두고 Python에서 subprocess.check_output 함수를 사용하는 방법에 대해 설명합니다. 실용적인 예제를 통해 작업을 자동화하고, 정보를 가져오며, 워크플로 효율성을 높이는 방법을 알아보세요. Python과 Git를 원활하게 통합하면서 현재 브랜치를 확인하고, 리모트를 나열하고, 리포지토리의 상태를 확인하는 방법을 살펴보세요.
이 페이지의 내용
subprocess.check_output()는 제공한 인수로 프로그램을 실행하고 그 표준 출력을 반환합니다. 셸 명령 문자열을 만들지 않고 명령의 결과를 캡처하려면 인수를 리스트로 전달하세요.
Python에서 subprocess.check_output() 사용하기
스크립트에 명령의 출력이 필요하고 0이 아닌 종료 상태를 실패로 처리해야 할 때는 subprocess.check_output()를 사용하세요. 이 함수는 Python의 subprocess 모듈의 일부이며, 명령을 병렬로 실행하지 않습니다.
구문과 반환 동작
축약된 호출 형태는 subprocess.check_output(args, *, cwd=..., timeout=..., text=None, ...)이며, 이는 완전한 함수 시그니처가 아닙니다. args는 명령과 그 인수를 제공합니다. cwd, timeout, text는 키워드 인수입니다. cwd는 자식 프로세스의 작업 디렉터리를 선택하고, timeout은 호출이 대기하는 시간을 제한하며, text는 캡처된 출력을 텍스트로 디코딩할지 여부를 제어합니다. text의 기본값은 None이므로 텍스트 모드를 활성화하지 않으면 출력은 바이트입니다. 전체 API 참조는 Python subprocess 문서를 참조하세요.
기본적으로 반환값은 바이트입니다. Python 문자열이 필요할 때 디코딩하세요. text=True를 지정하면 Python이 캡처된 출력을 대신 디코딩합니다. 이 간결한 예제는 Python 인터프리터에게 고정된 줄을 출력하게 하고, 바이트를 캡처한 뒤 UTF-8로 디코딩하여 그 줄을 표준 출력에 씁니다.
import subprocess
import sys
output = subprocess.check_output(
[sys.executable, "-c", "print('ready')"]
)
print(output.decode("utf-8"), end="")
ready
인수 리스트는 실행 파일과 그 인수를 분리된 상태로 유지합니다. subprocess.check_output(["git", "status"])와 같은 호출은 현재 디렉터리에서 Git의 표준 출력을 캡처합니다.
subprocess.check_output()로 Git 명령 실행하기
검사하려는 리포지토리에서 이 호출들을 실행하세요. 현재 브랜치를 읽으려면 subprocess.check_output(["git", "rev-parse", "--abbrev-ref", "HEAD"], text=True).strip()를 사용하세요. 리포지토리가 분리된 HEAD(detached HEAD) 상태일 때 Git는 브랜치 이름 대신 HEAD를 보고합니다.
구성된 리모트와 그 URL을 나열하려면 subprocess.check_output(["git", "remote", "-v"], text=True)를 사용하세요. 스테이징된 변경, 스테이징되지 않은 변경, 추적되지 않는 변경을 보려면 subprocess.check_output(["git", "status"], text=True)를 사용하세요. 이 명령들은 Git가 설치되어 있고 현재 작업 디렉터리가 대상 리포지토리 안에 있다는 것을 전제로 합니다. 필요할 때는 cwd를 해당 리포지토리 경로로 설정하세요.
오류 처리와 check_output()와 run() 중 선택하기
자식 프로세스가 0이 아닌 상태로 종료되면 subprocess.check_output()는 CalledProcessError를 발생시킵니다. 그 returncode에는 종료 상태가 기록되고, output 속성에는 캡처된 표준 출력이 들어 있습니다. 표준 오류는 기본적으로 캡처되지 않습니다. 표준 출력과 합치고 싶다면 stderr=subprocess.STDOUT를 전달하세요.
인수 리스트에는 셸이 필요하지 않습니다. 셸 해석으로 인해 명령 주입이 가능해질 수 있으므로, 신뢰할 수 없는 입력을 shell=True를 통해 명령에 전달하지 마세요. 셸 인용만으로는 일반적인 보안 해결책이 되지 않습니다.
출력을 캡처하고 실패한 종료를 오류로 처리하는 집중된 작업에는 subprocess.check_output()를 선택하세요. CompletedProcess도 필요하거나, 표준 스트림에 대한 더 많은 제어가 필요하거나, 종료 상태를 처리하는 방법을 선택해야 할 때는 subprocess.run()을 선택하세요. 예를 들어 subprocess.run(args, capture_output=True, text=True, check=False)는 코드가 검사할 수 있도록 상태와 캡처된 스트림을 반환합니다.