将终端中函数的输出覆盖到同一行



我有一个函数,例如

def f(x):
    for i in range(x):
        print i

在f(x)函数中不做任何添加,是否可以在运行时覆盖终端行?例如,在我的例子中,它显示如下:

print f(5)

输出是:

1
2
3
4

但是我想让它覆盖,而不是像这样打印:

print f(5)
4

请记住,我不能在f(x)函数内修改

一般来说,没有;但这取决于"终端"的假设也许吧。许多终端窗口都模仿古代的光标来自一个或多个"玻璃tty"终端的定位命令。在在这种情况下,如果你假设你知道要模拟的是哪个终端,您可以发送光标定位命令以移动到前一个位置

由于print发出换行符,并且您不能在此之后返回,因此必须不惜一切代价防止在终端中发出换行符。

可以通过重定向sys.stdout来实现。print将输出到您的新流。在您的流中,删除换行并添加回车。做

import sys

def f(x):
    for i in range(x):
        print i
class fake():
    def __init__(self):
        self.__out = sys.stdout
    def write(self,x):
        r = self.__out.write(x.replace("n","")+"r")
        self.__out.flush()  # flush like if we wrote a newline
        return r

sys.stdout=fake()
f(5)
结果:

  • 在终端(windows或Linux):只显示4
  • 重定向到一个文件:我们看到所有的数字由r字符分隔

好吧,这是一个hack,但我们不能修改f,我们没有…任务完成。

一旦我们完成,将sys.stdout恢复到原始值可能是有用的。

如果您试图只打印最后一行,您可以通过管道输出,并使用tail命令只检索最后一个单词。

有用链接:https://kb.iu.edu/d/acrj

最新更新