某些应用程序(如hellanzb)可以通过动态刷新数据的方式打印到终端,有点像top()。
这样做是python中最好的方法吗?我已经阅读了日志和诅咒,但不知道该使用什么。我正在创建一个顶级的重新实现。如果您有任何其他建议,我也向他们开放。
答案 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')