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

时间:2011-06-27 03:16:28

标签: python terminal ffmpeg subprocess

终止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()

这里可能出现什么问题?

4 个答案:

答案 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,这将使您的终端不隐藏键击。