【问题标题】:Replace multple lines in a console in Python without Curses在没有诅咒的Python中替换控制台中的多行
【发布时间】:2018-05-23 13:47:24
【问题描述】:

所以我有一个脚本可以向网站发送请求,然后显示响应数据包的状态代码。比如:

METHOD | COUNT

  200  | 2 results
  404  | 987 results
  500  | 1 results
  ...

这需要一段时间才能完成,所以我让它在一个机器上运行,我使用 Linux 工具 Screen 将其 ssh 进去。这个问题是 screen 不适用于 Python 的 curses 模块,因为要从屏幕终端分离(所以我可以注销并让它继续运行)它需要我按下捕获的 ctrl+a+d 然后被curses 忽略。

我知道您可以像这样覆盖在 Python 中输出到控制台的单行:

    out = "200 | {} results\r".format(num)
    sys.stdout.write(out)
    sys.stdout.flush()

但是有没有办法将它扩展到多行,所以我可以做更多类似的事情:

    # Updates approx once a second
    out = ""
    for code, num in STATUS_CODES:
        out += "{} | {}\r\n".format(code, num)

    sys.stdout.write(out)
    sys.stdout.flush()

【问题讨论】:

  • 你应该可以正常使用curses,而不用拦截 CTRL+A、D 序列...
  • curses 和脚本本身运行良好。问题是,在我从sys.stdout.write() 切换到curses 后,按ctrl+a+d 不再执行任何操作,所以如果不停止脚本运行,我根本无法退出。
  • 你是如何初始化curses的? (需要说明的是,如果我只是在 screen 会话中执行 import curses; w = curses.initscr(),我仍然可以 Ctrl+A、D 就好了。)
  • 使用 main: curses.wrapper(main) 周围的包装器,然后使用传递给 mainstdscr 对象作为参数。我想我可以改用stdscr = curses.initscr() 试试看是否有帮助
  • 对。 wrapper 做的不仅仅是initscr,所以他们可能是这里的问题。 github.com/python/cpython/blob/…

标签: python terminal python-curses


【解决方案1】:

我的答案是清除整个屏幕:

sys.stdout.write("\x1b[2J\x1b[H")

然后在每次更新时重写我的所有数据。请注意,这并不理想,因为它显然只适用于支持 ANSI 的终端,而且看起来有点 hacky。由于我的脚本只是为我准备的,所以它适合我的目的。

【讨论】:

    猜你喜欢
    • 2013-02-28
    • 2014-04-23
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2018-12-21
    • 2018-02-27
    • 2010-09-24
    • 1970-01-01
    相关资源
    最近更新 更多