在Python curses中,如何将输出放在新的一行?

3
我将使用Python中的curses模块来读取文件并实时显示输出。使用addstr()函数将字符串消息输出到控制台,但我无法在需要的位置换行打印。
示例代码:
import json
import curses
w=curses.initscr()

try:
    while True:
        with open('/tmp/install-report.json') as json_data:
            beta = json.load(json_data)
            w.erase()
            w.addstr("\nStatus Report for Install process\n=========\n\n")
            for a1, b1 in beta.iteritems():
                w.addstr("{0} : {1}\n".format(a1, b1))
            w.refresh()
finally:
    curses.endwin()

以上代码并未在每次迭代时输出字符串到新行(请注意addstr()中的\n)。相反,如果我调整终端窗口大小,脚本将失败并报错。

w.addstr("{0} ==> {1}\n".format(a1, b1))
_curses.error: addstr() returned ERR

为什么不直接使用 print() 方法输出您的信息呢?您是否有需要查看以前打印的内容,或者在打印过程中中断程序的原因? - Wayne Werner
@WayneWerner 我正在尝试实时输出数据,当后端的JSON文件被更新时。为此,我使用curses。类似于Linux的'top'命令格式。在curses上下文中,print()语句不能正确适应,因为我正在不断循环读取文件。所以print()将混乱控制台。 - cool77
@SurestTexas 如果有人没有给出使用某个东西的原因,我不会假设他们使用它有一个好的理由。经验表明,大多数情况下......他们没有! - Wayne Werner
@SurestTexas,你见过软件开发人员吗?我的意思是,有些人甚至使用emacs ;) 说真的 - 除了说他们正在使用curses之外,这个问题中是否有任何暗示需要它呢?从我看到的来看,恰恰相反 - OP正在打印安装的状态报告。这与看到OP发布他们正在使用pandas读取.csv文件并对其中一列求和完全相同。是的,他们可以这样做,但这可能过于繁琐,而且OP可能不知道他们可以用另一种方式完成。我们中的一些人只是被闪亮的东西所吸引。 - Wayne Werner
面对不确定性,拒绝猜测的诱惑。如果看起来像鸭子(打印语句)并且嘎嘎叫像鸭子(打印语句),那么我会问他们是否应该使用鸭子(打印语句):) - Wayne Werner
1个回答

4

由于程序内容较少,只能提供一些通用建议:

  • 如果您的脚本没有启用滚动(参见window.scroll),则在打印到屏幕末尾时会出现错误。
  • 如果调整了终端窗口大小,则必须读取键盘以处理任何KEY_RESIZE(并忽略错误)。

关于扩展问题,这些功能可以像这样使用:

import json
import curses
w=curses.initscr()
w.scrollok(1) # enable scrolling
w.timeout(1)  # make 1-millisecond timeouts on `getch`

try:
    while True:
        with open('/tmp/install-report.json') as json_data:
            beta = json.load(json_data)
            w.erase()
            w.addstr("\nStatus Report for Install process\n=========\n\n")
            for a1, b1 in beta.iteritems():
                w.addstr("{0} : {1}\n".format(a1, b1))
            ignore = w.getch()  # wait at most 1msec, then ignore it
finally:
    curses.endwin()

我在上下文中添加了额外的代码(编辑了我的原始帖子)。我查阅了curses文档,但不知道如何在我的代码上下文中实现window.scroll或KEY_RESIZE。 - cool77
现在它能工作了。我发现一个小问题,当输出超过屏幕时,我无法向上滚动查看输出的初始行。有没有办法向上滚动并查看最初的输出行? - cool77
这是可以预料的(如果您的应用程序需要这样做,它必须使用足够大的缓冲区而不仅仅是窗口,或者使用其他保存数据的方式)。 - Thomas Dickey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接