【问题标题】:Terminal output turns black终端输出变黑
【发布时间】:2014-07-15 08:48:58
【问题描述】:

简短版:我有一个程序在无限循环中向终端打印连续整数。在某些时候,终端变黑了,看不到任何输出,但我仍然可以执行命令。

详情

我在 PCG 中阅读了this answer,并想在 Python 中尝试一下。这里是:

#!/bin/python2
class Dier(object):
   def __init__(self):
       global ct
       ct += 1
       print ct
   def __del__(self):
       Dier()

ct = 0
Dier()

这个程序无限循环,打印每一步的迭代次数。从 Ubuntu gnome 终端执行过夜(我们在几分钟内达到数百万),终端只显示黑色。程序仍在运行,并出现新行,但什么都看不到。我杀死了程序,但终端,包括命令提示符,是黑色的。我可以输入命令,它们可以工作,但看不到任何输出。

为什么会这样?

我在 cmets 中提供的一些信息:

  • 程序使用的内存(由 top 报告)保持不变且较低。
  • 我可以在终端上打印非常大的数字而不会出现这种情况。我打印的最大数字有10^10^6位(当然终端忘记了开头,只显示最后一位,但它的log10是1246124)。我的程序不可能走那么远,那将花费数百万倍于宇宙的年龄。
  • 补充说明,如果我尝试打印比这更大的东西,它似乎会冻结,使用 CPU 但没有任何输出(虽然原始输出在那里,但不可见) .

【问题讨论】:

  • 我对你的断言“新行出现,但什么都看不到”有点困惑......如果新行出现,那么它们是可见的。相反,如果什么都看不到,那么你怎么知道出现了新行呢?
  • @twalberg 屏幕是黑色的,但我可以看到我正在书写的光标位置。
  • “终端”究竟是什么意思? xterm?侏儒终端?或者你的意思是你的文本控制台?还是您的意思是插入 PC 串行端口的 IBM-3101?
  • 我认为这与终端缓冲区和 python 输出缓冲区有关。您是否尝试过每次调用 sys.stdout.flush() ?有趣的代码...
  • 我很确定这是一个 gnome-terminal 的东西,而不是 python 的东西。在 gnome-terminal 中从 python 脚本打印大量日志后,我经历了这一点。当我滚动时,文本通常会重新出现,这显然意味着错误是 post-sys.stdout。

标签: python linux terminal


【解决方案1】:

似乎正在缓冲输出。您应该尝试将打印更改为

print ct, "\n"

print ct
sys.stdout.flush()

或者,您可以通过使用-u 参数(请参阅https://docs.python.org/2/using/cmdline.html#cmdoption-u)或设置PYTHONUNBUFFERED=1 env 变量(请参阅https://docs.python.org/2/using/cmdline.html#envvar-PYTHONUNBUFFERED)调用它来告诉python不要缓冲输出

【讨论】:

  • 我现在没有 GNOME 来测试它,但是,为什么剩下的输出会是黑色的?我把程序杀了,还能写命令,而且都是黑的。
  • sys.stdout.flush() 不会改变行为。
猜你喜欢
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
  • 2014-12-21
  • 1970-01-01
  • 2020-02-24
  • 2017-09-16
  • 2023-03-03
  • 2019-12-05
相关资源
最近更新 更多