是否存在任何标准的“带电池”方法来清除Python脚本中的终端屏幕,还是必须使用curses(库而不是词语)?
请注意:我已按原样保留了HTML标记。一个简单跨平台的解决方案是在Windows使用cls
命令,在Unix系统上使用clear
命令。与os.system
一起使用,可形成一行代码:
import os
os.system('cls' if os.name == 'nt' else 'clear')
os.system
的字符串都是固定的。 - pokeclear
和 cls
命令所做的事情):print("\n" * 100)
。 - jsbuenocls
命令并不只是打印空行。它会显式地清除控制台缓冲区,因此它不等同于打印任意数量的空格。另外,这段代码的效果出乎意料地好,尽管被视为“明显错误”。你可能不喜欢它,但这并不能说明它是错的(更不用说在Windows上,cls
不是一个进程,而是控制台宿主的功能,例如cmd.exe或PowerShell)。 - pokecls
和clear
本质上是不同的 - 因为clear
是一个外部进程,不清除缓冲区 - 这使得解决方案不一致且效率低下。cls
可能是Windows中的一个shell内置命令 - 但system
调用将仍然运行一个新的shell。
“系统函数将命令传递给命令解释器,该解释器将字符串作为操作系统命令执行。 system使用COMSPEC和PATH环境变量来定位命令解释器文件CMD.exe。” #https://msdn.microsoft.com/en-us/library/277bwbdz.aspx - jsbueno转义序列怎么处理?
print(chr(27) + "[2J")
为什么没有人谈论在 Windows 上只需按 Ctrl+L 或在 Mac 上按 Cmd+L 进行清屏,这肯定是最简单的方法。
os.system('clear')
命令来清屏,但我认为你的答案是最简单的方法。已点赞! :) - serenesat就我而言,最优雅的选择是:
import os
os.system('cls||clear')
对于Windows、Mac和Linux,你可以使用以下代码:
import subprocess, platform
if platform.system()=="Windows":
if platform.release() in {"10", "11"}:
subprocess.run("", shell=True) #Needed to fix a bug regarding Windows 10; not sure about Windows 11
print("\033c", end="")
else:
subprocess.run(["cls"])
else: #Linux and Mac
print("\033c", end="")
jamesnotjim 在 Mac 上测试了 print("\033c", end="")
,我在 Linux 和 Windows 上进行了测试(它在 Windows 上不起作用,因此需要调用另一个代码使用 cls
)。我不记得是谁最先使用 print("\033c")
或 printf 版本的,subprocess.run("printf '\033c'", shell=True)
。
rolika 指出,end=""
将防止之后打印新行。
请注意,新版本的 Ubuntu 可以完美地清除屏幕(不仅滚动到看起来已清除),而不像旧版本那样。
请注意,重置 ESC c("\033c")终端会使光标变为下划线并闪烁。如果您不想要这个效果,可以使用以下代码将其更改为其他样式(在使用 VTE 0.68.0 +BIDI +GNUTLS +ICU +SYSTEMD 的 GNOME 终端 3.44.0 上进行测试):
还请注意,您可以使用以下任何方法在 Linux 上清除屏幕:
我相信以下代码应该清除你必须向上滚动才能看到的内容(但它很难与另一个命令一起使用而没有问题):
这可以做到与 clear
以前的作用相同(所以您可以向上滚动查看已删除的内容,但不会将光标移到顶部):
print("\033c", end="")
。该代码会清除屏幕并继续在同一行上输出。 - rolika如果你在Linux/UNIX系统上,那么打印ANSI转义序列以清除屏幕应该可以完成任务。您还需要将光标移到屏幕顶部。这将适用于支持ANSI的任何终端。
import sys
sys.stderr.write("\x1b[2J\x1b[H")
如果没有启用 ANSI 支持,则此方法无法在 Windows 上运行。对于 Windows,可能存在等效的控制序列,但我不确定。
print
(如果没有进行 softspace
调整和/或 sys.stdout.flush()
)永远不可能将光标留在屏幕左上角,所以我编辑了你的回答,使之适用于Python 2.x和3.x。 - tzotsys.stderr.flush()
。print()
实际上也同样有效。 - Wayne Wernerimport colorama; colorama.init()
让 "\x1b[2J\x1b[H"
序列在Windows上也能够正常工作。 - jfs只需使用:
print("\033c")
这将清除终端窗口。
print("\033c", end="")
在清除控制台时不会插入换行符。 - GG_Python我之前偶然发现了这个。
def clearscreen(numlines=100):
"""Clear the console.
numlines is an optional argument used only as a fall-back.
"""
# Thanks to Steven D'Aprano, http://www.velocityreviews.com/forums
if os.name == "posix":
# Unix/Linux/MacOS/BSD/etc
os.system('clear')
elif os.name in ("nt", "dos", "ce"):
# DOS/Windows
os.system('CLS')
else:
# Fallback for other operating systems.
print('\n' * numlines)
然后只需使用 clearscreen()
你可以尝试使用clear,但它可能并不适用于所有Linux发行版。在Windows上使用cls,就像你提到的那样。
import subprocess
import platform
def clear():
subprocess.Popen( "cls" if platform.system() == "Windows" else "clear", shell=True)
clear()
注意:占用控制终端屏幕可能被认为是不好的行为。您是否考虑使用选项?最好让用户决定是否要清除屏幕。
注意:占用控制终端屏幕可能被认为是不好的行为。您是否考虑使用选项?最好让用户决定是否要清除屏幕。
os.system
?这里有什么优势? - TryPyPysubprocess.call()
。 - ThiefMaster这将在Python2版本和Python3版本中都可以工作。
print (u"{}[2J{}[;H".format(chr(27), chr(27)))
print(u"{}[2J{}[;H".format(chr(27), chr(27)), end="")
。 - Emma Labbé
clear
,因为这样很可能涵盖了大多数情况。请参阅相关问题如何清除Python解释器控制台?。 - martineau