用python动态终端打印

时间:2010-01-23 06:33:30

标签: python terminal

某些应用程序(如hellanzb)可以通过动态刷新数据的方式打印到终端,有点像top()。

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

10 个答案:

答案 0 :(得分:48)

最简单的方法是,如果您只需更新一行(例如,创建进度条),则使用'\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函数来调用主函数,如果出现错误,它将负责清理终端,因此之后它不会处于不可用状态。

如果您创建一个更复杂的UI,您可以为屏幕的不同部分,文本输入框和鼠标支持创建多个窗口。

答案 1 :(得分:13)

正如大多数答案已经说明的那样,你在Linux上几乎没有选择,只能使用ncurses。但是如果你不是在Linux上,或者想要一些更高级别的东西来创建你的终端用户界面呢?

我个人发现Python中缺乏一个现代的,跨平台的终端API令人沮丧,所以写了asciimatics来解决这个问题。它不仅为您提供simple cross-platform API,还为UI widgets and animations提供了许多更高级别的抽象,可以轻松地用于创建类似顶级的UI。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我使用curses攻击了此脚本。它真的是一个特殊的解决方案,我做了一个有趣的。它不支持滚动,但我认为如果你想在终端上构建一个包含多行的实时更新监视器,这是一个很好的起点。

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

答案 4 :(得分:0)

当我在Unix上的shell脚本中执行此操作时,我倾向于使用clear程序。您可以使用Python子进程模块来执行它。它至少可以让你快速找到你想要的东西。

答案 5 :(得分:0)

如果使用属性“end”,则无需滚动即可通过print()命令将输出发送到终端。

默认为end ='\ n',这是一个新行。

要禁止滚动并覆盖整个前一行,可以使用RETURN转义符'\ r'。

如果您只想重写最后四个字符,可以使用一些后退空格。

print(value, "_of_", total, end='\r')

注意 这适用于标准系统终端。像IDLE这样的工具中的终端模拟器有一个错误而且'\ r'不能正常工作,输出只是与一些不可打印的字符连接在一起。

打印信息() 在上面的例子中,“of”每一边的空格用于确保我的值和单词“of”之间的空白。但是,print()的默认分隔符是“”(空格),因此我们最终在“_of_”的值和下划线之间有空格。

>> print (value, "_of_", total, end='\r')
8 _of_ 17

sepparator属性sep可用于在打印项之间设置字符。在我的示例中,我将其更改为空字符串('')以使我的输出符合我的需要。

>> print (value, "_of_", total, sep='', end='\r')
8_of_17

答案 6 :(得分:0)

import time
for i in range(10):
    print('\r{}>'.format('='*i), end='')
    time.sleep(0.5)

答案 7 :(得分:0)

我不认为在这种情况下包含另一个库是一种很好的做法。所以,解决方案:

print("\rCurrent: %s\t%s" % (str(<value>), <another_value>), end="")

答案 8 :(得分:-1)

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

curses它是。

答案 9 :(得分:-1)

为打印静态和动态信息,我在循环中使用了一个字符串。

from sys import stdout

for I in range(1,10):
  std_string = 'Current no. is ' + I
  stdout.write("\r%s"%std_string)
  stdout.flush()
stdout.write('\n')