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_outputTrue로 설정합니다:

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.

checkTrue로 설정되어 있고 반환 코드가 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는 파이썬에서 출력을 문자열로 조작하려는 경우 유용합니다. 출력을 파일로 직접 리디렉션할 때는 필수가 아닙니다.

관련 링크

Morty Proxy This is a proxified and sanitized view of the page, visit original site.