终端最后一行类似 apt 的进度

Fel*_*lix 1 python linux terminal subprocess

我想编写一个 python 脚本,在终端的最后一行显示其当前进度,类似于apt(not apt-get) 的行为。我知道有 ANSI 控制序列可以与终端交互,但问题是我想调用其他程序(使用subprocess)来生成自己的输出。我不想让这些程序覆盖我的进度。

可能有多个子进程同时运行。我正在使用该multithreading模块,每个线程都会执行一些工作,然后调用并等待子进程,然后执行清理工作。我不介意子进程的输出被混合,只要最后一行不受影响。

当程序退出时,最后一行应该被清除。

Fel*_*lix 5

感谢PM 2Ring 的评论,我找到了我需要的一切。

控制序列"\033[X;Yr"(或"\x1b[X;Yr")告诉终端仅将行滚动XY。我没有测试 when 发生什么X != 0,因为我想保持回滚缓冲区不变。\033[r重置终端以滚动整个窗口。

要实现动态,您应该确定终端的高度,然后减去所需的静态行数,然后适当设置滚动范围。

为了避免乱码输出,您应该确保在设置滚动范围后光标不在静态区域中。例如,您的窗口有 [w=120,h=40] 行大小,并且您需要 2 个静态状态行。确定光标位置(例如[x=5,y=39]),如果它在窗口的最后两行内,则打印2个换行符,然后将光标定位在[x=5,y=(h-2) =38]。

要更新状态区域,请保存光标位置,将其移动到状态行,清除状态行,打印状态(不带尾随换行符),恢复光标位置。有转义序列来保存和恢复位置。重置滚动范围时清除状态区域。

有用的网址: