Я пытаюсь выполнить системную команду с подпроцессом и считывать вывод.Killing python ffmpeg subprocess breaks cli output
Но если команда занимает более 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)
Проблема заключается в том: После того, как выходит из программы не символы не отображаются в кли, пока я не достиг возвращения. И удар по возвращению не даст мне новой линии.
Я полагаю, что это имеет какое-то отношение к трубе stdout и stderr.
Я попытался гиперемией и чтением из трубы (p.stdout.flush())
Я также попытался с различными POPEN аргументов, но, возможно, что-то пропустил. Просто подумал, что я останусь здесь просто.
Я запускаю это на сервере Debian.
Я что-то упустил?
EDIT:
Это кажется, что это только в том случае, когда убийство продолжающийся процесс FFmpeg. Если процесс ffmpeg выходит нормально до 10 секунд, проблем нет.
Я попытался выполнить несколько разных команд, которые занимают больше 10 секунд, тот, кто печатает вывод, тот, кто этого не делает, и команду ffmpeg для проверки целостности файла.
args = ['sleep', '12s'] # Works fine
args = ['ls', '-R', '/var'] # Works fine, prints lots for a long time
args = ['ffmpeg', '-v', '1', '-i', 'large_file.mov','-f', 'null', '-'] # Breaks cli output
Я считаю, что ffmpeg печатает с использованием \ r и печатает все на трубе strerr. Это может быть причиной? Есть идеи, как это исправить?
Thx Ryan, вы правы, он отлично работает. Кажется, это только в случае убийства текущих процессов ffmpeg. См. Мое редактирование. – JayLev