실행중인 프로세스의 stdout
을 정기적으로 확인해야하는 경우. 예를 들어, 프로세스는 tail -f /tmp/file
이며 파이썬 스크립트에서 생성됩니다. 그런 다음 x 초마다 해당 하위 프로세스의 stdout이 문자열에 쓰여지고 처리됩니다. 서브 프로세스는 결국 스크립트에 의해 중지됩니다.Python에서 실행중인 하위 프로세스의 표준 출력을 확인하십시오.
지금까지 check_output
(사용 된 경우) 프로세스가 여전히 실행 중이며 명확한 출력을 생성하지 않기 때문에 작동하지 않는 것처럼 보일 경우 하위 프로세스의 stdout을 구문 분석합니다.
>>> from subprocess import check_output
>>> out = check_output(["tail", "-f", "/tmp/file"])
#(waiting for tail to finish)
이 여러 하위 프로세스의 출력은 (예를 들어, 꼬리 -f/TMP/FILE1 꼬리 -f/TMP/파일 2)을 처리 할 수 있도록 구성 프로세스에 대한 스레드를 사용할 수 있어야한다.
하위 프로세스를 시작하고 주기적으로 stdout을 확인 및 처리하고 결국 멀티 스레딩 방식으로 하위 프로세스를 중지 할 수 있습니까? python 스크립트는 Linux 시스템에서 실행됩니다.
목표는 파일을 계속 읽지 않는 것이고 tail 명령은 사용 된 실제 명령과 똑같이 작동하므로 예제입니다.
편집 : 나는 이것을 통해 파일이 존재하지 않는다고 생각했습니다. check_output
은 이제 프로세스가 끝날 때까지 기다립니다.
EDIT2
:Popen
과 함께 PIPE
다른 방법은, 동일한 문제가 발생할 것으로 보인다.
tail
이 완료 될 때까지 기다립니다.
>>> from subprocess import Popen, PIPE, STDOUT
>>> cmd = 'tail -f /tmp/file'
>>> p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT, close_fds=True)
>>> output = p.stdout.read()
#(waiting for tail to finish)
http://stackoverflow.com/a/6482200/1866177은 아마도이 문제를 해결합니다. – Dschoni
예제는 stdout을 읽을 수없는 것보다 더 큰 문제가 있습니다. 고쳐주세요. –
@Dschoni, OP가 출력을 리디렉션하지 않고 가져 오려고합니다. 이것은 당신이 제공 한 링크보다 조금 더 완성되었습니다. –