2011-06-27 35 views
12

端接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

我想它有不便做'标准输出= O,标准错误= e' – warvariuc

+0

在Django的runserver当它重新加载存在同样的问题。 –

+0

我已将stdout和stderr重定向到os.devnull,问题仍然存在 – wim

回答

11

更改脚本,以便没有使用proc.terminate()。你可以用

proc.send_signal(signal.SIGINT) 
    proc.wait() 

这允许的ffmpeg写任何转义序列,它需要恢复终端的机会更礼貌地停止ffmpeg子。


编辑:发现later-还有一个小窍门,使ffmpeg表现得更好Popen是提供它subprocess.PIPEopen(os.devnull)stdin手柄。否则,它似乎试图从父母的标准输入中获得输入,这可能会导致终端的奇怪行为。正在运行的ffmpeg进程正在侦听'?'和stdin上的'q'输入。

+0

将stdin设置为'open(os.devnull)'作品 – mononoke

2

你与子沟通?在这种情况下,我会使用pexpect,这种设置非常简单,也许您必须等待命令完成?即

p = subprocess.Popen(argv, stdout=o, stderr=e) 
p.wait() 
if p.returncode != 0: 
     print("problems") 

这就是我在dvd2h264剧本我写了一段时间后使用,从未有过任何问题,但我不重定向标准输入/标准错误到TMPFILES ..

+0

没有真正的互动交流 - 我编码实时流从捕获卡在管道,并且当脚本接收(无论是从键盘,或从另一个脚本)一SIGINT的POPEN实例终止。我也尝试过使用proc.send_signal(signal.SIGINT),并且在检查proc.returncode之前等待半秒。如果它仍然是None,那么我用terminate()来终止它(我认为它使用了SIGTERM) – wim

+0

好的,你能提取失败的代码,即制作一个我可以尝试的“hallo fail”示例?失败终端的原因必须是将转义序列写入stdout,但为了看看会发生什么情况,产生错误的小代码片段将有所帮助。 – bjarneh

+0

谢谢,我已经看到了使用转义序列可以用彩色文本编写的例子,所以你给了我一些想法来尝试 - 也许我需要'unsescape'回纯文本。可惜我不能为您提供始终如一失败的例子,因为它似乎是一个间歇性的问题,你有可能会需要相同的采集卡重现它 – wim

1

​​为我工作。它重置设置使回声隐形。