使用python进行dynamicterminal打印

某些应用程序,如hellanzb,有一种打印到terminal的方式,dynamic刷新数据,类似top()。

什么是最好的方法在Python这样做? 我已经阅读了日志和诅咒,但不知道要使用什么。 我正在创build顶部的重新实现。 如果您有任何其他build议,我也向他们开放。

最简单的方法,如果你只需要更新一行(例如创build一个进度条),就是使用'\r' (回车)和sys.stdout

 import sys import time for i in range(10): sys.stdout.write("\r{0}>".format("="*i)) sys.stdout.flush() time.sleep(0.5) 

如果您需要一个支持移动指针的适当的控制台UI,请使用标准库中的curses模块:

 import time import curses def pbar(window): for i in range(10): window.addstr(10, 10, "[" + ("=" * i) + ">" + (" " * (10 - i )) + "]") window.refresh() time.sleep(0.5) curses.wrapper(pbar) 

使用curses.wrapper函数来调用你的main函数是非常明智的,在错误的情况下,它会负责清理terminal,所以在之后它不会处于不可用的状态。

如果您创build更复杂的用户界面,则可以为屏幕的不同部分,文本input框和鼠标支持创build多个窗口。

由于大多数答案已经说明,你真的没有select在Linux上,但使用ncurses 。 但是如果你不在Linux上,或者想要创build一个terminal用户界面的更高层次的东西呢?

我个人发现在Python中缺乏一个现代的,跨平台的terminalAPI令人沮丧,所以写了asciimatics来解决这个问题。 它不仅为您提供了一个简单的跨平台API ,还为UI小部件和animation提供了许多更高层次的抽象,可以轻松地创build顶级UI。

听起来像是一个curses的工作。 它是文本模式屏幕布局和pipe理最常用的库。 Python对curses有非常好的支持,包括对面板的支持:

当我在Unix上使用shell脚本执行此操作时,我倾向于使用清除程序。 您可以使用Python子stream程模块来执行它。 它至less会让你快速find你想要的东西。

 [ignacio@localhost ~]$ ldd /usr/bin/top | grep curses libncursesw.so.5 => /lib64/libncursesw.so.5 (0x0000003ae1400000) 

curses它。

我用curses砍了这个脚本。 它真的是一个我为了乐趣而做的特别解决scheme。 它不支持滚动,但我认为它是一个很好的起点,如果你正在寻求在terminal上build立一个多行实时更新显示器。

https://gist.github.com/tpandit/b2bc4f434ee7f5fd890e095e79283aec