终止子进程后终端文本变为不可见

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.PIPEopen(os.devnull)stdin句柄中.否则,它似乎试图从父的stdin获取输入,这可能导致奇怪的终端行为.正在运行的ffmpeg进程正在侦听'?' 和stdin上的'q'输入.


Ian*_*ter 8

正如这个答案中所述,ffmpeg 需要来自标准输入的数据。您可以使用该-nostdin标志运行 ffmpeg,它将阻止您的终端隐藏击键。