wim*_*wim 14 python terminal subprocess ffmpeg
终止ffmpeg
子进程后,终端搞砸了 - 键入的字符是不可见的!输入仍可用于执行命令,但键盘输入不会回显到终端.
发出shell命令reset
会使一切恢复正常(或!reset
从ipython中恢复),因此解决问题的方法是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)
Run Code Online (Sandbox Code Playgroud)
后来阻止它:
proc.terminate()
proc.communicate()
Run Code Online (Sandbox Code Playgroud)
这可能会出错?
wim*_*wim 16
更改脚本以便proc.terminate()
不使用.您可以ffmpeg
更礼貌地停止子流程
proc.send_signal(signal.SIGINT)
proc.wait()
Run Code Online (Sandbox Code Playgroud)
这允许ffmpeg有机会编写恢复终端所需的任何转义序列.
编辑:后来发现 - 另一个使ffmpeg
行为更好的提示Popen
是提供一个subprocess.PIPE
或open(os.devnull)
在stdin
句柄中.否则,它似乎试图从父的stdin获取输入,这可能导致奇怪的终端行为.正在运行的ffmpeg进程正在侦听'?' 和stdin上的'q'输入.