스택큐힙리스트

'timeout'를 사용하여 'subprocess' 모듈 사용하기 본문

카테고리 없음

'timeout'를 사용하여 'subprocess' 모듈 사용하기

스택큐힙리스트 2023. 4. 18. 10:02
반응형

임의의 명령어를 실행하여 반환되는 stdout 데이터를 반환하거나 비정상적인 종료 코드가있는 경우 예외를 발생시키는 Python 코드입니다.

proc = subprocess.Popen(

cmd,

stderr=subprocess.STDOUT, # Merge stdout and stderr

stdout=subprocess.PIPE,

shell=True)

communicate은 프로세스가 종료될 때까지 기다리기 위해 사용됩니다.

stdoutdata, stderrdata = proc.communicate()

해당 모듈은 제한 시간을 지원하지 않아(특정 초 이상 실행되고 있는 프로세스를 종료할 수 있는 능력), communicate을(를) 실행하는 데 영원히 걸릴 수 있습니다.

Windows와 Linux에서 실행할 Python 프로그램에서 Timeout을 구현하는 가장 간단한 방법은 무엇인가요?

답변 1

파이썬 3.3+에서:

from subprocess import STDOUT, check_output

output = check_output(cmd, stderr=STDOUT, timeout=seconds)

output는 명령어 병합된 표준 출력(stderr) 데이터를 포함하는 바이트 문자열입니다.

질문의 텍스트에서 지정된 것처럼 0이 아닌 종료 상태에서 CalledProcessError 를 발생시킵니다. proc.communicate() 방법과는 다릅니다.

나는 종종 불필요하게 사용되기 때문에 shell=True를 제거했습니다. 만약 실제로 필요하다면 언제든지 다시 추가할 수 있습니다. 자식 프로세스가 자체 하위 항목을 생성하는 경우 shell=True를 추가하면 타임아웃 표시보다 훨씬 늦게 check_output()이 반환될 수 있다는 것을 참고해주세요, Subprocess timeout failure를 참조하세요.

타임아웃 기능은 3.2 이상 서브프로세스 모듈의 subprocess32 역설적인 백포트를 통해 Python 2.x에서 사용할 수 있습니다.

답변 2

사용할 수 있는 유용한 파이썬 모듈 중 하나인 'subprocess'를 사용하여 프로그램 내에서 외부 명령어 및 프로그램을 실행할 수 있다. 그러나 때로는 실행하는데 시간이 많이 걸려서 프로그램이 멈추거나 빠르게 실행되어야 하는 경우가 있다. 'subprocess' 모듈을 이용하여 이러한 시간 제한 문제를 해결할 수 있다.

프로그램에서 'subprocess'를 사용하면 다른 프로그램을 실행하고 결과를 받아올 수 있다. 그러나 때로는 다른 프로그램이 실행하는 데 시간이 많이 걸릴 수 있다. 이 때, 'subprocess' 모듈을 사용하여 실행 시간을 제한할 수 있다. 'subprocess'모듈의 'timeout'인자를 사용하면 특정 시간 이내에 실행되지 않으면 프로세스를 강제로 중지시킬 수 있다.

이것은 일반적으로 보안 체계에서 유용할 수 있다. 외부 프로그램이 정상적으로 실행되고 있지 않으면 프로그램이 멈추지 않고 계속해서 실행될 수 있다. 이것은 보안에 매우 중요한 역할을 할 수 있다.

또 다른 장점은 'subprocess'가 다른 프로그램을 실행하고 결과를 반환하는 데 사용된다는 것이다. 이것은 프로그램에서 다른 프로그램을 호출하는 데 사용될 수 있다는 것을 의미한다. 이것은 또한 운영체제에서 사용할 수 있는 다른 프로그램에 액세스하는 데 사용될 수 있다. 따라서 이 기능은 유용성, 속도 및 효율성을 조합하여 시스템에서 다른 프로그램에 액세스하는 데 큰 도움이 될 수 있다.

결론적으로, 'subprocess' 모듈의 'timeout'인자를 사용하여 외부 프로그램을 실행하는 데 걸리는 시간을 제한할 수 있다. 이 기능은 보안성 및 시스템 효율성 측면에서 매우 중요할 수 있으며, 유용성, 속도 및 효율성을 조합하여 더 나은 시스템 구성을 위한 중요한 툴로 사용될 수 있다.

반응형
Comments