清空Python终端

269

是否存在任何标准的“带电池”方法来清除Python脚本中的终端屏幕,还是必须使用curses(库而不是词语)?

请注意:我已按原样保留了HTML标记。

我会检查是否为Windows并使用'cls',而对于所有情况都会无条件地执行clear,因为这样很可能涵盖了大多数情况。请参阅相关问题如何清除Python解释器控制台? - martineau
1
相关问题:https://dev59.com/_W445IYBdhLWcg3wia2V - tale852150
27个回答

422

一个简单跨平台的解决方案是在Windows使用cls命令,在Unix系统上使用clear命令。与os.system一起使用,可形成一行代码:

import os
os.system('cls' if os.name == 'nt' else 'clear')

47
我的答案中的代码显式安全,因为其中没有涉及用户输入。所有可能传递给os.system的字符串都是固定的。 - poke
3
这段代码明显有误,因为你运行了整个进程,而你只需要打印一些换行符(这就是 clearcls 命令所做的事情):print("\n" * 100) - jsbueno
42
我现在不能谈论Unix,但是在Windows上,cls命令并不只是打印空行。它会显式地清除控制台缓冲区,因此它不等同于打印任意数量的空格。另外,这段代码的效果出乎意料地好,尽管被视为“明显错误”。你可能不喜欢它,但这并不能说明它是错的(更不用说在Windows上,cls不是一个进程,而是控制台宿主的功能,例如cmd.exe或PowerShell)。 - poke
那意味着clsclear本质上是不同的 - 因为clear是一个外部进程,不清除缓冲区 - 这使得解决方案不一致且效率低下。cls可能是Windows中的一个shell内置命令 - 但system调用将仍然运行一个新的shell。 “系统函数将命令传递给命令解释器,该解释器将字符串作为操作系统命令执行。 system使用COMSPEC和PATH环境变量来定位命令解释器文件CMD.exe。” #https://msdn.microsoft.com/en-us/library/277bwbdz.aspx - jsbueno

162

转义序列怎么处理?

print(chr(27) + "[2J")

26
请注意,这在所有终端类型上都不可移植……尽管现在你可能不会经常遇到奇怪的终端类型。 - Ignacio Vazquez-Abrams
13
这个技巧可以将光标向下移动。尝试使用Ctrl+L,效果会有所不同。我认为脚本应该将光标位置重置到行顶部。 - Peter
5
现在,在Python3中,打印(chr(27) + "[2J")即可清除屏幕。 - david.barkhuizen
5
print('\x1b[2J') 可以在 Python 3 中使用,它的作用是清空终端窗口。 - ideasman42
27
抱歉,但我忍不住要说一句:https://imgs.xkcd.com/comics/real_programmers.png。 - Pitto
显示剩余8条评论

116

为什么没有人谈论在 Windows 上只需按 Ctrl+L 或在 Mac 上按 Cmd+L 进行清屏,这肯定是最简单的方法。


4
到目前为止,这是最好的答案。另外,你知道如何在Python控制台中向上滚动吗?因为当屏幕被填满时,我必须在最后一行上写代码而且它不会自动向上滚动。 - Parag Gangil
3
我正在使用Ubuntu操作系统,之前一直使用os.system('clear')命令来清屏,但我认为你的答案是最简单的方法。已点赞! :) - serenesat
129
对于那些想要以编程方式清除屏幕的人来说,@ParagGangil的回答并不是最好的。 - Eric Wilson
2
这个答案为什么不在最上面,它明显是最好的。 - DanielSon
10
无效。只需要在命令行中输入^L(在Windows 10的Python控制台中)。 - Alexander Kuzin
显示剩余5条评论

73

就我而言,最优雅的选择是:

import os
os.system('cls||clear')

导入 os 并且使用 os.system('clear') 在 OS X 上工作。 - Adam Erickson
4
这实际上是一个非常有趣的解决方案 - 我没有意识到那是特别可能的... - SirJames
2
@SirJames,非常简单。Windows接受“cls”并忽略其他内容,而Unix运行已知的函数并忽略“cls”。 - Vasiliy Rusin
是的,我知道命令提示符和bash可以做什么功能...但我没有想到我可以在Python中同样轻松地实现它。 - SirJames
1
相当不错...类似于pip3 install clear-screen。 - user10364045

46

对于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 上进行测试):

  • 下划线闪烁:"\033[0 q"
  • 块状闪烁:"\033[1 q"
  • 块状:"\033[2 q"
  • 下划线闪烁:"\033[3 q"
  • 下划线:"\033[4 q"
  • 细条闪烁:"\033[5 q"
  • 细条:"\033[6 q"(数字大于 6 也会做到这一点)

还请注意,您可以使用以下任何方法在 Linux 上清除屏幕:

  • print("\033c", end=""):
  • print("\u001bc", end="")
  • print("\U0000001bc", end="")
  • print("\x1bc", end="")
  • subprocess.run(["clear"]) # 这不会重置整个终端
  • subprocess.run('echo -ne "\033c"', shell=True)
  • subprocess.run('echo -ne "\ec"', shell=True)
  • subprocess.run('echo -ne "\u001bc"', shell=True)
  • subprocess.run('echo -ne "\U0000001bc"', shell=True)
  • subprocess.run('echo -ne "\x1bc"', shell=True)
  • subprocess.run("printf '\033c'", shell=True)
  • subprocess.run("printf '\ec'", shell=True)
  • subprocess.run("printf '\u001bc'", shell=True)
  • subprocess.run("printf '\U0000001bc'", shell=True)
  • subprocess.run("printf '\x1bc'", shell=True)

我相信以下代码应该清除你必须向上滚动才能看到的内容(但它很难与另一个命令一起使用而没有问题):

  • print("\033[3J")

这可以做到与 clear 以前的作用相同(所以您可以向上滚动查看已删除的内容,但不会将光标移到顶部):

  • print("\033[2J")

9
这对我也有效(使用print("\033c")),我认为这是最佳解决方案。与os.system('clear')相比,无需导入os,并且它还可以清除滚动缓冲区。 - Ross
1
只需按照此处描述的发送终端命令以清除屏幕,实际上是一个很好的方法。如果您想要(更)复杂的终端操作,可以使用诸如blessings之类的库。 - Fred
3
有人知道 "\033c" 是什么意思吗? - Aby W
1
@AbyW \033 是八进制数,代表ASCII中的转义序列ESC,相当于十六进制的\x1b。<ESC>c是一个重置终端所有设置为默认值的转义序列。 - Kronen
4
如果不想要打印一个换行符,可以使用print("\033c", end="")。该代码会清除屏幕并继续在同一行上输出。 - rolika
显示剩余5条评论

42

如果你在Linux/UNIX系统上,那么打印ANSI转义序列以清除屏幕应该可以完成任务。您还需要将光标移到屏幕顶部。这将适用于支持ANSI的任何终端。

import sys
sys.stderr.write("\x1b[2J\x1b[H")

如果没有启用 ANSI 支持,则此方法无法在 Windows 上运行。对于 Windows,可能存在等效的控制序列,但我不确定。


3
因为你的回答暗示你正在使用Python 2.x,而且由于2.x中的 print (如果没有进行 softspace 调整和/或 sys.stdout.flush())永远不可能将光标留在屏幕左上角,所以我编辑了你的回答,使之适用于Python 2.x和3.x。 - tzot
4
对于任何想知道的人,这条字符串是一系列ANSI转义码。 \x1b[ 是一个控制序列引导符(十六进制0x1B)。代码2J清除整个屏幕。代码H设置光标位置,默认情况下不带参数将光标设置到左上角。 - Preston
3
请问为什么你要将信息写入错误流(stderr)而不是标准输出流(stdout)呢? - Aaron
2
我可以确认在我的机器上运行 Arch Linux、zsh 和 Python3,以及在 tmux(通过 ssh)中,stderr 是有缓冲的,需要我运行 sys.stderr.flush()print() 实际上也同样有效。 - Wayne Werner
4
import colorama; colorama.init()"\x1b[2J\x1b[H" 序列在Windows上也能够正常工作。 - jfs
显示剩余3条评论

31

只需使用:

print("\033c")

这将清除终端窗口。


9
另外,print("\033c", end="") 在清除控制台时不会插入换行符。 - GG_Python
2
这与这个答案有何不同? - user76284
1
@user76284 这个更简单(而且这个回答都两年前了 :o) - Alex Hawking

11

我之前偶然发现了这个。

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()


1
我喜欢这个解决方案的可移植性。 - byxor

10

你可以尝试使用clear,但它可能并不适用于所有Linux发行版。在Windows上使用cls,就像你提到的那样。

import subprocess
import platform

def clear():
    subprocess.Popen( "cls" if platform.system() == "Windows" else "clear", shell=True)

clear()
注意:占用控制终端屏幕可能被认为是不好的行为。您是否考虑使用选项?最好让用户决定是否要清除屏幕。

注意:占用控制终端屏幕可能被认为是不好的行为。您是否考虑使用选项?最好让用户决定是否要清除屏幕。


为什么要使用 os.system?这里有什么优势? - TryPyPy
1
@TryPyPy 我错了,subprocess是用来替换os.system的,我应该使用它。原帖作者是正确的。 - Rod
4
针对这个简单的调用,我建议使用 subprocess.call() - ThiefMaster

10

这将在Python2版本和Python3版本中都可以工作。

print (u"{}[2J{}[;H".format(chr(27), chr(27)))

3
为了去除换行符,可以使用以下代码:print(u"{}[2J{}[;H".format(chr(27), chr(27)), end="") - Emma Labbé

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