终止ffmpeg
子进程后,终端搞砸了 - 键入的字符是不可见的!输入仍可用于执行命令,但键盘输入不会回显到终端。
发出shell命令reset
会使一切恢复正常(或者从ipython中恢复!reset
),因此解决此问题的方法是在脚本中调用os.system('reset')
。
我尝试过的其他事情:import curses; curses.initscr()
在产生子进程之前和curses.endwin()
在终止之后,这在某种程度上起了作用但打破了其他东西。另一个可能相关的问题是,在产生子进程之后,交互式终端变得迟钝并且有时无法捕获键入的字符。
产生该过程的代码如下:
with open('/tmp/stdout.log', 'w') as o:
with open('/tmp/stderr.log', 'w') as e:
proc = subprocess.Popen([args], stdout=o, stderr=e)
后来阻止它:
proc.terminate()
proc.communicate()
这里可能出现什么问题?
答案 0 :(得分:16)
更改脚本以便不使用proc.terminate()
。您可以使用
ffmpeg
子流程
proc.send_signal(signal.SIGINT)
proc.wait()
这允许ffmpeg有机会编写恢复终端所需的任何转义序列。
编辑:稍后发现 - 使ffmpeg
使Popen
表现得更好的另一个提示是在subprocess.PIPE
中提供open(os.devnull)
或stdin
{{1}}处理。否则,它似乎试图从父的stdin获取输入,这可能导致奇怪的终端行为。正在运行的ffmpeg进程正在侦听'?'和stdin上的'q'输入。
答案 1 :(得分:2)
你是否与子进程通信?在这种情况下,我会使用pexpect,这使得这种类型的设置非常简单,也许你必须等待命令完成?即。
p = subprocess.Popen(argv, stdout=o, stderr=e)
p.wait()
if p.returncode != 0:
print("problems")
这就是我在dvd2h264脚本上使用的,我写了一段时间,从来没有遇到任何问题,但我没有将stdin / stderr重定向到tmpfiles ..
答案 2 :(得分:2)
os.system('stty sane')
为我工作。它重置设置使回声不可见。
答案 3 :(得分:1)
如this answer中所述,ffmpeg期望来自stdin的数据。您可以使用-nostdin
标志运行ffmpeg,这将使您的终端不隐藏键击。