[파이썬] subprocess `subprocess.TimeoutExpired`: 타임아웃 예외 처리

타임아웃은 프로그램이 특정 작업을 완료하기 위해 할당된 시간을 초과할 때 발생하는 일반적인 상황입니다. Python에서 시스템 호출이나 외부 프로세스 실행과 같은 작업을 수행할 때, subprocess 모듈은 자주 사용됩니다. 이 모듈은 타임아웃 예외 처리를 지원하며, 이 글에서는 이를 다루고자 합니다.

타임아웃 예외 처리는 특정 작업을 실행하는 동안 제한된 시간 내에 완료되지 않을 경우 예외를 발생시킵니다. 이는 잠재적인 문제로 인해 작업이 무한히 실행되는 것을 방지할 수 있습니다. Python의 subprocess 모듈에서는 subprocess.TimeoutExpired라는 예외 클래스를 제공합니다.

subprocess.TimeoutExpired 예외

subprocess.TimeoutExpired 예외는 subprocess.run() 또는 subprocess.communicate() 같은 함수에서 타임아웃이 발생한 경우에 발생합니다. subprocess.TimeoutExpired 예외 객체는 args, timeout, output, stderr, cmd, stdout 등의 속성을 가질 수 있으며, 이를 통해 예외의 원인과 관련된 정보를 확인할 수 있습니다.

간단한 예제를 통해 subprocess.TimeoutExpired 예외를 사용해보겠습니다.

import subprocess

try:
    output = subprocess.run(['python', 'my_script.py'], timeout=5, capture_output=True, text=True)
except subprocess.TimeoutExpired as e:
    print(f"작업이 {e.timeout}초 안에 완료되지 않았습니다.")
    print(f"커맨드: {e.cmd}")
    print(f"표준 출력: {e.stdout}")
    print(f"에러 출력: {e.stderr}")

위의 코드에서는 subprocess.run() 함수를 사용하여 “my_script.py”를 실행하고 있습니다. timeout 매개변수를 5로 설정하여 타임아웃을 5초로 지정하였습니다. 만약 작업이 5초 내에 완료되지 않으면 subprocess.TimeoutExpired 예외가 발생합니다.

예외가 발생하면 해당 예외 객체(e 변수)로부터 타임아웃 시간, 커맨드, 표준 출력, 에러 출력 등의 정보를 얻을 수 있습니다. 이 정보를 활용하여 적절한 예외 처리를 수행할 수 있습니다.

타임아웃 예외 처리의 중요성

타임아웃 예외 처리는 프로그램의 안정성과 신뢰성을 확보하는 데 매우 중요합니다. 특히 외부 프로세스 실행 등을 포함한 장기 실행 작업을 수행하는 경우에 타임아웃을 적절히 설정하고 예외 처리를 통해 작업이 처리되지 않는 상황을 방지할 수 있습니다.

또한, 타임아웃 예외 처리를 통해 프로그램이 무한히 실행되거나 블록되는 것을 방지할 수 있습니다. 예상치 못한 문제로 인해 작업이 종료되지 않는 상황에서 타임아웃 설정은 중요한 역할을 합니다.

결론

Python의 subprocess 모듈은 타임아웃 예외 처리를 지원하는 subprocess.TimeoutExpired 예외를 제공합니다. 이를 통해 작업이 제한 시간 내에 완료되지 않을 경우 적절한 예외 처리를 수행할 수 있습니다. 타임아웃 예외 처리는 프로그램의 안정성과 신뢰성을 높이는 데 매우 중요하며, 외부 프로세스 실행 등 장기 실행 작업에 유용하게 활용할 수 있습니다.