After terminating an ffmpeg
subprocess, the terminal gets messed up – typed characters are invisible! The input still works in that commands can be executed, but keyboard input is not echoed to the terminal.
Issuing shell command reset
puts everything back to normal (or !reset
from within ipython), so a workaround the issue is calling os.system('reset')
inside the script.
Other things I’ve tried: import curses; curses.initscr()
before spawning the subprocess and curses.endwin()
after termination, which worked somewhat but broke other stuff. Another possibly related issue is that after spawning the child process, the interactive terminal becomes laggy and sometimes fails to capture typed characters.
The code to spawn the process looks like:
with open('/tmp/stdout.log', 'w') as o: with open('/tmp/stderr.log', 'w') as e: proc = subprocess.Popen([args], stdout=o, stderr=e)
And later to stop it:
proc.terminate() proc.communicate()
What could be going wrong here?
Advertisement
Answer
Change the script so that proc.terminate()
is not used. You can stop an ffmpeg
subprocess more politely with
proc.send_signal(signal.SIGINT) proc.wait()
This allows ffmpeg the chance to write whatever escape sequences it needs to restore the terminal.
edit: discovered later- another tip to make ffmpeg
behave better with Popen
is to provide it a subprocess.PIPE
or open(os.devnull)
in the stdin
handle. Otherwise, it seems to try to get input from the parent’s stdin which can cause weird terminal behaviour. A running ffmpeg process is listening for ‘?’ and ‘q’ input on stdin.