subprocess — 하위 프로세스 관리
subprocess — 하위 프로세스 관리
소스 코드: Lib/subprocess.py
subprocess 모듈은 새 프로세스를 생성하고, 그 입력/출력/오류 파이프에 연결하고, 반환 코드를 얻을 수 있게 합니다. 이 모듈은 os.system() 및 os.spawn*()과 같은 이전 모듈과 함수를 대체하기 위한 것입니다.
본문
권장되는 접근 방식
하위 프로세스를 실행하는 권장 방법은 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=True는stdout과stderr를 캡처합니다.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.CompletedProcess — run()이 반환하는 완료된 프로세스를 나타내는 클래스.
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으로 보내고stdout과stderr를 읽습니다.send_signal(signal)— 프로세스에 신호를 보냅니다.terminate()— 프로세스를 종료합니다.kill()— 프로세스를 강제로 종료합니다.args,stdin,stdout,stderr,pid,returncode속성.
상수
- subprocess.PIPE —
stdin,stdout,stderr의 특수 값으로 파이프를 열어야 함을 나타냅니다. - subprocess.DEVNULL —
os.devnull로 리디렉션해야 함을 나타내는 특수 값. - subprocess.STDOUT — 표준 오류를 표준 출력으로 리디렉션해야 함을 나타냅니다.
예외
- subprocess.SubprocessError — 이 모듈의 다른 예외의 기본 클래스.
- subprocess.TimeoutExpired —
timeout이 만료되었을 때 발생. - subprocess.CalledProcessError — 프로세스가 0이 아닌 종료 코드로 종료되었을 때
check=True인run()에 의해 발생. - 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'