在终端中无法使用print(foo, end="")的解决方法

12

这是一些代码,目的是类似于口袋妖怪游戏中的打印文本。纯属娱乐。

问题在于当程序在终端中运行时,print(x,end="")无法工作,但在使用IDLE运行时可以正常工作。

import time

lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."

for x in lorem:
    print(x, end="")
    time.sleep(0.03)

如果我在print(x, end="")之前放置一个打印语句,程序就能正常工作,但原因不明。

for x in lorem:
    print()
    print(x, end="")
    time.sleep(0.03)

有没有人知道是什么原因导致这个问题?还有可能如何解决它?


看起来你的终端在你打印回车之前不会清除输入(这就是第二个程序中print()所做的事情)。让顶部的程序运行一段时间,你最终应该会得到一个输出。 - Kevin W.
当它不起作用时会发生什么? - Peter Wood
1
print(x, end="") 后面添加 sys.stdout.flush() - inspectorG4dget
你可以运行未缓冲的Python。搜索命令行设置即可。 - Peter Wood
1个回答

19

这是因为Python使用缓冲区来写入标准输出。要获得所需的效果,您必须在代码末尾放置sys.stdout.flush()

import time, sys

lorem = "Lorem ipsum dolor sit amet, consectetur adipiscing elit."

for x in lorem:
    print(x, end="")
    time.sleep(0.03)
    sys.stdout.flush()

这将以每0.03秒1个字符的速度逐个打印出每个字符。


12
另一种方法是print(x, end="", flush=True)。(仅适用于Python 3.3+) - Aran-Fey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接