Python Subprocess 모듈
Subprocess는 새로운 시스템 프로세스를 생성하고, 해당 프로세스의 입력/출력/오류 스트림에 연결하며, 반환 코드를 얻을 수 있게 해주는 내장 모듈입니다.
import subprocess
시스템 명령어 실행하기
run 함수는 시스템 명령어를 실행하는 데 사용됩니다.
subprocess.run(['echo', 'Hello World!'])
Hello World!
명령어를 리스트 대신 단일 문자열로 실행하려면 다음을 사용합니다:
subprocess.run('echo Hello World!', shell=True)
Hello World!
두 방법 모두 자동으로 출력을 터미널에 인쇄합니다.
경고
신뢰할 수 없는 입력에는 `shell=True` 사용을 피하십시오 (쉘 인젝션 위험).
출력 캡처하기
출력을 캡처하려면 capture_output을 True로 설정합니다:
result = subprocess.run(
['echo', 'Hello World!'],
capture_output=True,
text=True
)
output = result.stdout
error = result.stderr
returncode = result.returncode
output = "Hello World!\n"
error = ""
returncode = 0
여기서 text=True는 함수에게 출력을 바이트가 아닌 텍스트로 읽도록 지시합니다.
returncode가 0 이면 성공을 나타내며, 0 이 아닌 값은 오류를 나타냅니다.
오류 확인하기
반환 코드를 사용하여 성공 여부를 확인할 수 있지만, 더 파이썬스러운 방법이 있습니다:
try:
result = subprocess.run(
['ls', 'my_dir'],
check=True,
)
print('Finished without errors.')
except subprocess.CalledProcessError:
print('Error: Directory does not exist.')
Error: Directory does not exist.
check가 True로 설정되어 있고 반환 코드가 0 이 아닌 경우 (작업 실패), subprocess 는 subprocess.CalledProcessError를 발생시키며, 이는 일반적인 방식으로 except 블록을 사용하여 처리할 수 있습니다.
타임아웃을 가진 명령어 실행하기
프로세스에 타임아웃을 설정할 수 있습니다. 지정된 시간보다 오래 걸리면 subprocess.TimeoutExpired가 발생합니다:
try:
subprocess.run(['sleep', '10'], timeout=5)
except subprocess.TimeoutExpired:
print('Process took too long!')
Process took too long!
출력을 파일에 쓰기
출력을 파일로 리디렉션하려면 stdout (필요한 경우 stderr도) 을 파일 객체로 설정합니다:
with open('output.txt', 'w') as f:
subprocess.run(['ls', '-l'], stdout=f, stderr=f)
여기서 일반 출력과 오류 모두 생성된 순서대로 파일에 나타납니다.
참고: text=True는 파이썬에서 출력을 문자열로 조작하려는 경우 유용합니다. 출력을 파일로 직접 리디렉션할 때는 필수가 아닙니다.