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

Python 终端最后一行的apt类进度,python,linux,terminal,subprocess,Python,Linux,Terminal,Subprocess,我想编写一个python脚本,在终端的最后一行显示当前进度,类似于apt(而不是apt get)的行为。我知道有ANSI控制序列可以与终端交互,但问题是我想调用其他程序(使用子进程)来生成它们自己的输出。我不希望这些程序覆盖我的进度 可能有多个子进程同时运行。我正在使用多线程模块,每个线程执行一些工作,然后调用并等待子进程,然后执行清理工作。我不介意子流程的输出被混合,只要最后一行被保留 当程序退出时,最后一行应该被清除。多亏了,我找到了我需要的一切 控制序列“\033[X;Yr”(或“\x1b

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

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

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

多亏了,我找到了我需要的一切

控制序列
“\033[X;Yr”
(或
“\x1b[X;Yr”
)告诉终端只将行
X
滚动到
Y
。我没有测试
X!=0
时会发生什么,因为我想保持滚动缓冲区的原样。
\033[r
重置终端以滚动整个窗口

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

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

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

有用链接:


如果您在终端顶部有进度线,则可能会更容易复制此库。下面是我不久前编写的一个示例:但也请注意,我强烈推荐此库。我相信它具有满足您要求的所有功能。@jbndlr使用
\r
是一种有用的技术,但Felix需要一些简单的东西tle比这更强大。我不认为它是重复的;这个问题描述了如何写入到最后一行。这个问题的重点是分离子进程和其他输出。