서브 프로세스와 출력을 읽는 시스템 명령을 실행하려고합니다.파이썬 ffmpeg 서브 프로세스를 종료하면 cli 출력이 깨집니다.
그러나 명령에 10 초 이상 걸리면 하위 프로세스를 종료하려고합니다.
여러 가지 방법으로 시도해 보았습니다.
내 마지막 시도는이 게시물에 의해 영감을했다 : https://stackoverflow.com/a/3326559/969208
예 :
import os
import signal
from subprocess import Popen, PIPE
class Alarm(Exception):
pass
def alarm_handler(signum, frame):
raise Alarm
def pexec(args):
p = Popen(args, stdout=PIPE, stderr=PIPE)
signal.signal(signal.SIGALRM, alarm_handler)
signal.alarm(10)
stdout = stderr = ''
try:
stdout, stderr = p.communicate()
signal.alarm(0)
except Alarm:
try:
os.kill(p.pid, signal.SIGKILL)
except:
pass
return (stdout, stderr)
문제는 : 프로그램이 내가 수익을 명중 할 때까지 아무런 문자가 CLI에 표시되지 않습니다 종료 후. 그리고 돌아 오는 길은 나에게 새로운 라인을주지 않을 것이다.
이것은 stdout 및 stderr 파이프와 관련이 있다고 가정합니다.
내가 세척을 시도하고 파이프에서 읽는 것 (p.stdout.flush())
나는 또한 다른는 popen 인수와 시도했지만 뭔가를 놓친 적이 있습니다. 그냥 내가 여기서 간단하게 할거라 생각 했어.
데비안 서버에서 실행 중입니다.
여기에 뭔가가 있습니까?
편집 : 지속적는 FFmpeg 프로세스를 죽일 때 이것은 단지의 경우와 같다
. ffmpeg 프로세스가 10 초 전에 정상적으로 종료되면 아무런 문제가 없습니다.
출력을 인쇄하는 사람, 사람이없는 사람, ffmpeg 명령을 사용하여 파일의 무결성을 검사하는 데 10 초 이상 걸리는 다른 명령을 실행 해 보았습니다.
저는 ffmpeg가 \ r을 사용하여 인쇄하고 strerr 파이프의 모든 것을 인쇄한다고 생각합니다. 이것이 원인 일 수 있습니까? 어떤 아이디어로 그것을 고치는 법?
Thx Ryan, 네 말이 맞아. 이것은 진행중인 ffmpeg 프로세스를 죽이는 경우에만 해당하는 것 같습니다. 내 편집을 참조하십시오. – JayLev