サブプロセスを使用してシステムコマンドを実行し、出力を読み取ろうとしています。
しかし、コマンドに 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)
問題は次のとおりです。プログラムが終了した後、return キーを押すまで cli に文字が表示されません。また、改行を押しても改行されません。
これは stdout および stderr パイプと関係があると思います。
パイプからのフラッシュと読み取りを試みました(p.stdout.flush())
また、さまざまな Popen 引数を試してみましたが、何かを見落としている可能性があります。ここはシンプルにしようと思いました。
これを Debian サーバーで実行しています。
ここで何か不足していますか?
編集:
これは、進行中の ffmpeg プロセスを強制終了する場合にのみ発生するようです。10秒前にffmpegのプロセスが正常終了すれば、何の問題もありません。
出力を印刷するコマンド、印刷しないコマンド、ファイルの整合性をチェックする ffmpeg コマンドなど、10 秒以上かかるいくつかの異なるコマンドを実行してみました。
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 パイプに印刷すると思います。これが原因でしょうか?それを修正する方法はありますか?