gpt4 book ai didi

python - 文本环绕时清除终端中的最后一行

转载 作者:太空宇宙 更新时间:2023-11-04 02:38:46 24 4
gpt4 key购买 nike

在我的 python 程序中,我想在一个很长的循环中打印进度。我想输出特定信息,如完成百分比等...,但我不希望所有这些输出占据整个屏幕。

理想情况下,我想打印一条进度线。有点像

train 53/56...x6 │ loss:1.356 │ miou:0.276 │ rate=3.13 Hz, eta=0:00:01, total=0:00:17, wall=19:48 EST

然后,当打印下一行时,我想简单地覆盖这一行。

目前,我可以通过在打印消息之前简单地打印回车符 '\r' 来做到这一点。这会将光标返回到行的开头,然后覆盖该行。正是我想要的。

问题是,当终端太小而无法容纳整行时,该行会环绕,回车会将我带到环绕行的开头,而不是该行的绝对开头。

有没有办法让光标一直回到正确行的开头?

最佳答案

您可以使用 ANSI escape sequences for cursor movement ,最值得注意的是:

  • Position the Cursor: \033[<L>;<C>H, or \033[<L>;<C>f puts the cursor at line L and column C.
  • Move the cursor up N lines: \033[<N>A
  • Move the cursor down N lines: \033[<N>B
  • Move the cursor forward N columns: \033[<N>C
  • Move the cursor backward N columns: \033[<N>D
  • Save cursor position: \033[s
  • Restore cursor position: \033[u

光标位置保存/恢复似乎很适合你的情况,但不幸的是,这两个代码不被许多终端仿真器接受。

他们在 xterm 工作和 xfce4-terminal虽然(除了在终端/滚动输出的最后一行,正如@ThomasDickey 在评论中指出的那样)。尝试:

echo -e "\033[s" {1..100} "\033[u" "Overwrite"

对于其他终端仿真器,您可以使用 \033[<N>A 试试运气。将光标向上移动所需的行数,然后移动到列 0 .

如果您知道行的长度,则可以使用(bash 示例,注意 COLUMNS 环境变量的用法)计算它跨越多少行(如果换行):

line='...'
len=${#line}
rows=$((len / COLUMNS))

然后向上移动:

printf "\033[%dA" "$rows"

在 Python 中,您可以像这样使用它:

print("\033[s", "123"*100, "\033[u", "Overwrite", sep='')
print("\033[%dA" % 3, "Overwrite", sep='')

或者,用 curses 之类的东西抽象所有这些.


Python解决方案

基于将光标向上移动 N 行 ANSI 转义序列(应该适用于大多数终端仿真器)和跨 Python 兼容 code for terminal width detection (在 Python3 中,您可以使用 shutil.get_terminal_size ),这是一个概念验证演示,使用滚动输出,适应行长度和改变终端宽度:

#!/usr/bin/env python
from __future__ import print_function
import os
import time

cnt = 0
while True:
with os.popen('stty size', 'r') as stty:
rows, columns = stty.read().split()

line = "Run: {}, Columns: {}, Filler: {}".format(cnt, columns, "***"*100)
print(line)
print("\033[{}A".format(len(line) // int(columns) + 1), end='')

time.sleep(1)
cnt += 1

关于python - 文本环绕时清除终端中的最后一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47169869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com