subprocess — 하위 프로세스 관리

subprocess — 하위 프로세스 관리

소스 코드: Lib/subprocess.py

subprocess 모듈은 새 프로세스를 생성하고, 그 입력/출력/오류 파이프에 연결하고, 반환 코드를 얻을 수 있게 합니다. 이 모듈은 os.system()os.spawn*()과 같은 이전 모듈과 함수를 대체하기 위한 것입니다.

출처: Python documentation

본문

권장되는 접근 방식

하위 프로세스를 실행하는 권장 방법은 run() 함수를 사용하는 것입니다. 더 세밀하게 제어해야 하는 고급 사용 시나리오를 위해 Popen 인터페이스가 직접 사용될 수 있습니다.

  • **subprocess.run(args, *, stdin=None, input=None, stdout=None, stderr=None, capture_output=False, shell=False, cwd=None, timeout=None, check=False, encoding=None, errors=None, text=None, env=None, universal_newlines=None, other_popen_kwargs)args로 설명된 명령을 실행하고 완료된 CompletedProcess 인스턴스를 반환합니다. 인자 capture_output=Truestdoutstderr를 캡처합니다. timeout이 만료되면 TimeoutExpired가 발생합니다. check=True이면 종료 코드가 0이 아닐 때 CalledProcessError가 발생합니다.

run() 사용 예:

import subprocess

# List files in a directory
result = subprocess.run(['ls', '-l'], capture_output=True, text=True)
print(result.stdout)

# Check return code
subprocess.run(['true'], check=True)

subprocess.CompletedProcessrun()이 반환하는 완료된 프로세스를 나타내는 클래스.

  • args — 실행된 명령의 인자.
  • returncode — 하위 프로세스의 종료 상태.
  • stdout — 캡처된 표준 출력.
  • stderr — 캡처된 표준 오류.
  • check_returncode()returncode가 0이 아니면 CalledProcessError를 발생시킵니다.

Popen 생성자

Popen은 하위 프로세스를 생성하고 그 파이프를 관리하는 저수준 인터페이스입니다.

  • *subprocess.Popen(args, bufsize=-1, executable=None, stdin=None, stdout=None, stderr=None, preexec_fn=None, close_fds=True, shell=False, cwd=None, env=None, universal_newlines=None, startupinfo=None, creationflags=0, restore_signals=True, start_new_session=False, pass_fds=(), , user=None, group=None, extra_groups=None, encoding=None, errors=None, text=None, umask=-1, pipesize=-1, process_group=None) — 새 프로세스를 실행합니다. args는 프로그램 인자 목록입니다. stdin, stdout, stderr는 파일 핸들을 지정합니다. shell=True이면 셸을 통해 명령을 실행합니다.

Popen 객체는 다음과 같은 메서드와 속성을 가집니다.

  • poll() — 종료 코드가 있는지 확인합니다. 없으면 None을 반환합니다.
  • wait(timeout=None) — 하위 프로세스가 종료될 때까지 기다리고 종료 코드를 반환합니다.
  • communicate(input=None, timeout=None) — 프로세스와 상호 작용합니다. 데이터를 stdin으로 보내고 stdoutstderr를 읽습니다.
  • send_signal(signal) — 프로세스에 신호를 보냅니다.
  • terminate() — 프로세스를 종료합니다.
  • kill() — 프로세스를 강제로 종료합니다.
  • args, stdin, stdout, stderr, pid, returncode 속성.

상수

  • subprocess.PIPEstdin, stdout, stderr의 특수 값으로 파이프를 열어야 함을 나타냅니다.
  • subprocess.DEVNULLos.devnull로 리디렉션해야 함을 나타내는 특수 값.
  • subprocess.STDOUT — 표준 오류를 표준 출력으로 리디렉션해야 함을 나타냅니다.

예외

  • subprocess.SubprocessError — 이 모듈의 다른 예외의 기본 클래스.
  • subprocess.TimeoutExpiredtimeout이 만료되었을 때 발생.
  • subprocess.CalledProcessError — 프로세스가 0이 아닌 종료 코드로 종료되었을 때 check=Truerun()에 의해 발생.
  • subprocess.Popen` — 프로세스 생성 실패 시 발생.

보안 고려 사항

shell=True는 명령 주입 취약점을 유발할 수 있으므로 신뢰할 수 없는 입력에는 사용하지 마세요. args를 문자열이 아닌 인자 목록으로 전달하고 shell=False(기본값)을 사용하는 것이 좋습니다. 자세한 내용은 보안 고려 사항을 참고하세요.

예제

import subprocess

# Capture output
p = subprocess.run(['echo', 'hello'], capture_output=True, text=True)
print(p.stdout)  # 'hello\n'

# Popen
p = subprocess.Popen(['cat'], stdin=subprocess.PIPE, stdout=subprocess.PIPE, text=True)
out, err = p.communicate(input='Hello')
print(out)  # 'Hello'

더 알아보기 (Learn more)