我有一个函数,例如
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