在 Python 中清除终端 [重复]

Clear terminal in Python [duplicate]

提问人:Stefano Borini 提问时间:1/18/2010 最后编辑:XantiumStefano Borini 更新时间:10/16/2022 访问量:620570

问:

是否存在任何标准的“自带电池”方法来清除 Python 脚本中的终端屏幕,或者我是否必须去诅咒(库,而不是单词)?

Python 终端

评论

0赞 martineau 1/27/2011
我会检查 Windows 并使用“cls”,然后无条件地对所有内容执行操作,因为这可能会涵盖大多数情况。请参阅相关问题如何清除 python 解释器控制台?clear
1赞 jfs 3/5/2016
相关新闻: Python - 更优雅地清除终端屏幕
1赞 tale852150 6/13/2016
相关 stackoverflow.com/questions/4810537/...

答:

2赞 Ignacio Vazquez-Abrams 1/18/2010 #1

您可以撕毁 terminfo 数据库,但这样做的函数无论如何都在。curses

163赞 Joril 1/18/2010 #2

转义序列呢?

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

评论

26赞 Ignacio Vazquez-Abrams 1/18/2010
请注意,这并非在所有终端类型中都是可移植的......并不是说这些天你会遇到太多奇怪的类型......
13赞 Peter 2/19/2013
此技术将光标向下。尝试 Ctrl+L,效果不同。我认为脚本应该将光标位置重置到行的顶部。
5赞 david.barkhuizen 1/19/2014
或者现在,在 Python3 中,print(chr(27) + “[2J”)
5赞 ideasman42 3/11/2014
print('\x1b[2J') - 也适用于 py3
27赞 Pitto 4/9/2018
对不起,伙计们,但我无法抗拒:imgs.xkcd.com/comics/real_programmers.png
2赞 Dyno Fu 1/18/2010 #3

python -c "from os import system; system('clear')"

评论

15赞 Yann Ramin 1/18/2010
拜托,不。太可怕了。
3赞 Stefano Borini 1/18/2010
嗯,它有效。不过有点咄咄逼人。
6赞 Nick Dandoulakis 1/18/2010
system('clear')很可怕吗?我不同意。
6赞 Dale Reidy 1/18/2010
support.microsoft.com/kb/99261 - 它没有win32api那么可怕:)
3赞 steinar 4/13/2017
@allyourcode 在命令是固定字符串的情况下,他们不是都建议这样做吗?那么我们最好不要建议在 bash 中删除文件——因为有人可能会误解它并以 root 身份执行。rm filerm -rf /
42赞 Dave Kirby 1/18/2010 #4

如果您使用的是 Linux/UNIX 系统,则打印 ANSI 转义序列以清除屏幕应该可以完成这项工作。您还需要将光标移动到屏幕顶部。这将适用于任何支持 ANSI 的终端。

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

除非启用了 ANSI 支持,否则这在 Windows 上不起作用。Windows 可能有等效的控制序列,但我不知道。

评论

3赞 tzot 2/21/2011
由于您的答案暗示您正在使用 Python 2.x,并且由于 2.x(没有调整和/或)永远无法将光标留在屏幕的左上角,因此我将您的答案编辑为可以在 Python 2.x 和 3.x 中使用的内容printsoftspacesys.stdout.flush()
4赞 Preston 7/28/2013
对于任何想知道的人来说,字符串是一系列 ANSI 转义码。\x1b[ 是控制序列引入器(十六进制0x1B)。代码 2J 清除整个屏幕。代码 H 设置光标位置,不带参数则默认为左上角。
3赞 Aaron 2/12/2014
你能解释一下你为什么要写到 stderr 而不是 stdout 吗?
2赞 Wayne Werner 11/6/2014
我可以确认 stderr tmux 内运行 Arch Linux、zsh 和 Python3 的机器上缓冲了(通过 ssh)——需要我运行 . 实际上效果也一样好。sys.stderr.flush()print()
4赞 jfs 3/6/2016
import colorama; colorama.init()使序列也能在 Windows 上运行。"\x1b[2J\x1b[H"
1赞 ghostdog74 1/18/2010 #5

你可以自己做。这不取决于您的终端或操作系统类型。

def clear(num):
    for i in range(num): print 

clear(80)
print "hello"

评论

1赞 Ignacio Vazquez-Abrams 1/18/2010
...那里不需要空字符串文字。...什么?我试图在这里保持积极的态度
1赞 ghostdog74 1/18/2010
你很迂腐,但我会给你
424赞 poke 1/18/2010 #6

一个简单的跨平台解决方案是在 Windows 或 Unix 系统上使用该命令。与 os.system 一起使用,这是一个很好的单行代码:clsclear

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

评论

47赞 poke 3/26/2016
@allyourcode 我的答案中的代码明确不会被注入,因为那里不涉及用户输入。所有可以传递给的字符串都是固定的。os.system
3赞 jsbueno 6/2/2016
代码显然是错误的,因为你运行了整个过程,而你所需要的只是打印出一些换行符(这是两者和 and 所做的):clearclsprint("\n" * 100)
42赞 poke 6/2/2016
@jsbueno我现在还不能说 Unix,但在 Windows 上不只是打印空行。它显式清除控制台缓冲区,因此它不等同于打印任何数量的空格。此外,该代码对于“明显错误”的内容效果出奇地好。您可能不喜欢它,但这并不意味着它是错误的(更不用说在Windows上不是一个进程,而是控制台主机的功能,例如cmd.exe或PowerShell)。clscls
0赞 jsbueno 6/2/2016
因此,这意味着 和 本质上是不同的 - 就像外部进程一样,并且不会清除缓冲区 - 这使得解决方案不一致,除了效率低下之外,可能是 Windows 中内置的 shell - 但调用仍然会运行一个新的 shell。“系统函数将命令传递给命令解释器,后者将字符串作为操作系统命令执行。系统使用 COMSPEC 和 PATH 环境变量来查找命令解释器文件 CMD.exe。“ #msdn.microsoft.com/en-us/library/277bwbdz.aspxclsclearclearclssystem
1赞 Falmarri 1/27/2011 #7

如果您只需要清除屏幕,这可能就足够了。问题是,在 linux 版本中甚至没有 100% 跨平台的方式来做到这一点。问题是终端的实现都支持略有不同的东西。我相当确定“清除”将在任何地方都有效。但更“完整”的答案是使用 xterm 控制字符来移动光标,但这本身需要 xterm。

在不了解您的问题的情况下,您的解决方案似乎已经足够好了。

10赞 Rod 1/27/2011 #8

您可以尝试依赖 clear,但它可能并非在所有 Linux 发行版上都可用。在 Windows 上使用您提到的 cls。

import subprocess
import platform

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

clear()

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

评论

0赞 TryPyPy 1/27/2011
为什么?这里有什么优势?os.system
1赞 Rod 1/27/2011
@TryPyPy 我的错误。子进程旨在替换 os.system,我应该使用它。OP是对的。
4赞 ThiefMaster 10/29/2013
不过,我会用这个电话这样简单的事情。subprocess.call()
0赞 Ben 1/27/2011 #9

一种可能很俗气的清除屏幕的方法,但可以在我所知道的任何平台上使用,如下所示:

for i in xrange(0,100):
    print ""

评论

0赞 Rod 1/27/2011
它将光标留在窗口的末尾。它还保留了滚动回以前存在的内容的可能性。可能是一件好事,也可能不是一件好事。此外,您可能希望输入更大的数字,因为某些用户可能使用超过 100 行...;)
5赞 Noctis Skytower 5/30/2012
您还可以编写在 Python 2.x 和 3.x 中工作,同时速度更快。print ('\n' * 100)
1赞 B-Rell 4/30/2013 #10

这将清除 25 条新行:

def clear():
    print(' \n' * 25)

clear()

我将eclipse与pydev一起使用。我更喜欢换行符解决方案,而不是范围内的 for numfor 循环会抛出警告,而 print 换行符不会。 如果要在 clear 语句中指定换行符的数量,请尝试此变体。

def clear(j):
    print(' \n' * j)

clear(25)

评论

1赞 jsbueno 6/2/2016
25 行在今天几乎不是一个标准——70 行更能保证向上滚动一个严肃的终端中使用的所有行(窗口的各种 DOS shell 重制版不被认为是严肃的,主要是由于 UI 限制)
0赞 Riyad El-Laithy 6/18/2013 #11

对于 Windows,仅在解释器命令行上(而不是 GUI)!只需输入: (记得在python中使用正确的缩进):

import os
def clear():
    os.system('cls')

每次在 shell(命令行)上键入时,它都会清除 shell 上的屏幕。如果退出 shell,则必须重做上述操作,以便在打开新的 Python(命令行)shell 时再次执行此操作。clear()

注意:无论您使用哪个版本的 Python,显式(2.5、2.7、3.3 和 3.4)都无关紧要。

评论

3赞 m3nda 8/28/2015
这种方式可以与 platform.system() 结合使用来获取“Windows”、“Linux”或其他系统平台信息,然后为每个操作系统设置明确的命令。我有我的cls()名称如下def cls(): if platform.system() == "Linux": os.system("clear") elif platform.system() == "Windows": os.system("cls")
-3赞 Jagadish Sahoo 8/8/2013 #12

默认情况下,/ 将返回 0 的 int 类型。 我们可以通过将屏幕分配给变量并删除它来完全清除屏幕。os.system("clear")os.system("cls")

def clear():
    if (os.name == 'nt'):    
        c = os.system('cls')
    else:
        c = os.system('clear')
    del c  # can also omit c totally

#clear()

评论

2赞 Joop 8/8/2013
2 年多前给出的答案重复......更长,更不优雅。请参阅@poke此问题得票最多的答案
4赞 32 revsJD Graham #13

此函数在 gnome-terminal 中有效,因为默认情况下,它识别 ANSI 转义序列。它为您提供了从终端底部开始的 CLEAN PROMPT 距离,但也恰好从调用它的位置开始。让您可以完全控制要清除的金额。rows_max

def clear(rows=-1, rows_max=None, *, calling_line=True, absolute=None,
          store_max=[]):
    """clear(rows=-1, rows_max=None)
clear(0, -1) # Restore auto-determining rows_max
clear(calling_line=False) # Don't clear calling line
clear(absolute=5) # Absolutely clear out to 5 rows up"""
    from os import linesep
    if rows_max and rows_max != -1:
        store_max[:] = [rows_max, False]
    elif not store_max or store_max[1] or rows_max == -1 or absolute:
        try:
            from shutil import get_terminal_size
            columns_max, rows_max = get_terminal_size()
        except ImportError:
            columns_max, rows_max = 80, 24
        if absolute is None:
            store_max[:] = [rows_max, True]
    if store_max:
        if rows == -1:
            rows = store_max[0]
        elif isinstance(rows, float):
            rows = round(store_max[0] * rows)
        if rows > store_max[0] - 2:
            rows = store_max[0] - 2
    if absolute is None:
        s = ('\033[1A' + ' ' * 30 if calling_line else '') + linesep * rows
    else:
        s = '\033[{}A'.format(absolute + 2) + linesep
        if absolute > rows_max - 2:
            absolute = rows_max - 2
        s += (' ' * columns_max + linesep) * absolute + ' ' * columns_max
        rows = absolute
    print(s + '\033[{}A'.format(rows + 1))

实现:

clear() # Clear all, TRIES to automatically get terminal height
clear(800, 24) # Clear all, set 24 as terminal (max) height
clear(12) # Clear half of terminal below if 24 is its height
clear(1000) # Clear to terminal height - 2 (24 - 2)
clear(0.5) # float factor 0.0 - 1.0 of terminal height (0.5 * 24 = 12)
clear() # Clear to rows_max - 2 of user given rows_max (24 - 2)
clear(0, 14) # Clear line, reset rows_max to half of 24 (14-2)
clear(0) # Just clear the line
clear(0, -1) # Clear line, restore auto-determining rows_max
clear(calling_line=False) # Clear all, don't clear calling line
clear(absolute=5) # Absolutely clear out to 5 rows up

参数:是在提示符和终端底部之间添加的明文行数,将所有内容向上推。 是文本行中终端的高度(或最大清除高度),只需要设置一次,但可以随时重置。 在第三个参数位置表示以下所有参数都只是关键字(例如,clear(absolute=5))。 (默认)在交互模式下效果更好。 更适合基于文本的终端应用程序。 添加以尝试在减小终端尺寸后修复交互模式下的毛刺间隙问题,但也可用于终端应用。 只是为了秘密的、“持久”地存储价值;不要显式使用此参数。(如果未为 传递参数,则更改 的列表内容将更改此参数的默认值。因此,持久性存储。rowsrows_max*,calling_line=Truecalling_line=Falseabsolutestore_maxrows_maxstore_maxstore_max

可移植性:抱歉,这在 IDLE 中不起作用,但它在交互模式下>>非常酷<<在识别 ANSI 转义序列的终端(控制台)中工作。我只在 Ubuntu 13.10 中使用 gnome-terminal 中的 Python 3.3 对此进行了测试。因此,我只能假设可移植性取决于 Python 3.3(用于最佳结果的功能)和 ANSI 识别。该函数是 Python 3。我还用一个简单的、基于文本的终端井字游戏(应用程序)对此进行了测试。shutil.get_terminal_size()print(...)

在交互模式下使用:首先在交互模式下复制并粘贴该功能,看看它是否适合您。如果是这样,则将上述函数放入名为 clear.py 的文件中。在终端中,使用“python3”启动 python。进入:copy(...)

>>> import sys
>>> sys.path
['', '/usr/lib/python3.3', ...

现在将 clear.py 文件拖放到列出的目录之一中,以便 Python 可以找到它(不要覆盖任何现有文件)。从现在开始轻松使用:path

>>> from clear import clear
>>> clear()
>>> print(clear.__doc__)
clear(rows=-1, rows_max=None)
clear(0, -1) # Restore auto-determining rows_max
clear(calling_line=False) # Don't clear calling line
clear(absolute=5) # Absolutely clear out to 5 rows up

用于终端应用:将函数放入名为 clear.py 的文件中,该文件与.py文件位于同一文件夹中。下面是一个来自井字游戏应用程序的工作抽象(骨架)示例(从终端提示符运行:python3 tictactoe.py):copy(...)

from os import linesep

class TicTacToe:    
    def __init__(self):
        # Clear screen, but not calling line
        try:
            from clear import clear
            self.clear = clear
            self.clear(calling_line=False)
        except ImportError:
            self.clear = False
        self.rows = 0    # Track printed lines to clear

        # ...
        self.moves = [' '] * 9

    def do_print(self, *text, end=linesep):
        text = list(text)
        for i, v in enumerate(text[:]):
            text[i] = str(v)
        text = ' '.join(text)
        print(text, end=end)
        self.rows += text.count(linesep) + 1

    def show_board(self):
        if self.clear and self.rows:
            self.clear(absolute=self.rows)
        self.rows = 0
        self.do_print('Tic Tac Toe')
        self.do_print('''   |   |
 {6} | {7} | {8}
   |   |
-----------
   |   |
 {3} | {4} | {5}
   |   |
-----------
   |   |
 {0} | {1} | {2}
   |   |'''.format(*self.moves))

    def start(self):
        self.show_board()
        ok = input("Press <Enter> to continue...")
        self.moves = ['O', 'X'] * 4 + ['O']
        self.show_board()
        ok = input("Press <Enter> to close.")

if __name__ == "__main__":
    TicTacToe().start()

说明:第 19 行是 needed 的一个版本,用于跟踪已打印了多少新行 ()。否则,您将不得不在整个程序中到处调用。因此,每次通过调用重新绘制电路板时,都会清除前一个电路板,并将新电路板打印在应有的位置。请注意,第 9 行基本上将所有内容相对于终端底部向上推,但不会清除原始呼叫线路。相比之下,在第 29 行上绝对清除了所有向上的距离,而不仅仅是相对于终端底部向上推所有内容。do_print(...)print(...)self.rowsself.rows += 1print(...)show_board()self.clear(calling_line=False)self.clear(absolute=self.rows)self.rows

使用 Python 3.3 的 Ubuntu 用户:放在 tictactoe.py 文件的第一行。右键单击 tictactoe.py 文件 => 属性 => 权限选项卡 => 选中执行:允许将文件作为程序执行。双击文件 => 单击“在终端中运行”按钮。如果打开的终端的当前目录是 tictactoe.py 文件的目录,则还可以使用 启动该文件。#!/usr/bin/env python3./tictactoe.py

-6赞 Marley Plant 2/21/2014 #14

这适用于所有平台,并且在 Python 2 和 3 中都有效。

def clear(number):
    for i in range(number):
        print(" ")

然后要清除,只需键入 .clear(numberhere)

评论

1赞 Remigiusz Schoida 8/25/2018
坏。for 循环比 .也无需打印空间。print(""*100)
1赞 san1512 1/12/2022
这是终端上的打印空间,而不是清洁它。
46赞 Brōtsyorfuzthrāx 4/15/2014 #15

对于 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 进行了测试,我在 Linux 和 Windows 上对其进行了测试(它不适用于 Windows,因此调用了其他代码)。我不记得我第一次看到使用和/或printf版本是谁:.print("\033c", end="")clsprint("\033c")subprocess.run("printf '\033c'", shell=True)

Rolika指出,这将阻止它之后打印新行。end=""

请注意,与旧版本不同,较新版本的 Ubuntu 将使用 很好地清除屏幕(而不仅仅是向下滚动,因此它似乎已清除)。clear

请注意,使用 ESC c (“\033c”) 重置终端将使光标带有下划线并闪烁。如果你不想这样,你可以使用这些代码将其更改为另一种样式(在 GNOME Terminal 3.44.0 上使用 VTE 0.68.0 +BIDI +GNUTLS +ICU +SYSTEMD 进行测试):

  • 下划线闪烁:“\033[0 q”
  • 块闪烁:“\033[1 q”
  • 块: “\033[2 q”
  • 下划线闪烁:“\033[3 Q”
  • 下划线:“\033[4 q”
  • 细条闪烁:“\033[5 q”
  • 细条:“\033[6 q”(大于 6 的数字似乎也这样做)

另请注意,您可以执行以下任何操作来清除 Linux 上的屏幕:

  • 打印(“\033c”, end=“”):
  • 打印(“\u001bc”, end=“”)
  • 打印(“\U0000001bc”, end=“”)
  • 打印(“\x1bc”, end=“”)
  • subprocess.run([“clear”]) #This 不会重置整个终端
  • 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)

我相信以下代码应该可以清除您必须向上滚动才能看到的内容(但很难与另一个命令结合使用而不会出现问题):

  • 打印(“\033[3J”)

这可以做与以前相同的事情(因此您可以向上滚动以查看已删除的内容,但它不会将光标提升到顶部):clear

  • 打印(“\033[2J”)

评论

9赞 Ross 1/15/2015
这也对我有用(使用 print(“\033c”)),我认为这是最好的解决方案。与 os.system('clear') 进行比较时,无需导入 os。它也会在不回滚的情况下清除。
1赞 Fred 3/3/2016
只需将终端命令发送到清除屏幕,如此处所述实际上是一种很好的方法。如果你想要(更)更精细的终端内容,你可以使用一个库,比如祝福
3赞 Aby W 4/21/2016
有人知道\033c是什么意思吗?
1赞 Kronen 2/1/2018
@AbyW \033 是 ESC 的八进制数,即 ASCII 中的转义序列,相当于十六进制的 \x1b。<ESC>c 是一个转义序列,用于将所有终端设置重置为默认值。
4赞 rolika 7/8/2018
print("\033c", end="")如果不想打印换行符
0赞 DarkXDroid 5/18/2014 #16

我会以这种方式这样做,使它看起来更像 bash:

只需在主目录中创建一个名为 .pythonstartup 的文件,并在函数中使用 poke 的答案

在 Linux 上:

echo "from subprocess import call
def clear(int=None):  
    call('clear')
    if int == 0:
       exit()
clear()" >> $HOME/.pythonstartup ; export PYTHONSTARTUP=$HOME/.pythonstartup ; python

您可以添加到您的文件export PYTHONSTARTUP=$HOME/.pythonstartup./bashrc

因为我关心的是空间;对函数的调用不会在启动时显示 Python 解释器说明,但可以删除以保留它。clear()

像普通函数一样使用它应该在不打印退出状态的情况下解决问题:

>>> clear()

如果将参数 0 传递给函数,它将清除屏幕并成功退出,以便您可以在干净的屏幕中继续使用 shell

>>> clear(0)
8赞 mid_kid 6/1/2014 #17

纯 Python 解决方案。
不依赖于 ANSI 或外部命令。
只有您的终端必须能够告诉您视野中有多少条线。

from shutil import get_terminal_size
print("\n" * get_terminal_size().lines, end='')

Python 版本 >= 3.3.0

评论

7赞 jerm 8/9/2016
这不会将光标留在屏幕底部吗?
116赞 sarath joseph 10/30/2014 #18

为什么没有人谈论只是在 Windows 中简单地做 + 或在 Mac 中做 +。 当然是清除屏幕的最简单方法。CtrlLCmdL

评论

4赞 PG1 6/8/2015
这是迄今为止最好的答案。另外,您知道如何向上滚动我的 python 控制台,因为当屏幕被填满时,我必须在最后一行上写字,而它不会向上滚动。
3赞 serenesat 8/25/2015
我在 Ubuntu 上,我正在使用,但我认为您的答案是最简单的方法。点赞!:)os.system('clear')
129赞 Eric Wilson 10/2/2015
@ParagGangil 对于那些想要以编程方式清除屏幕的人来说,这不是最佳答案。
2赞 DanielSon 6/5/2016
这个答案怎么不在顶部,它是迄今为止最好的
10赞 Alexander Kuzin 2/8/2017
这是行不通的。只需在命令中键入 ^L(Windows 10 中的 Python 控制台)
73赞 Vasiliy Rusin 4/29/2016 #19

至于我,最优雅的变体:

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

评论

0赞 Adam Erickson 8/18/2016
import os 和 os.system('clear') 在 OS X 上工作。
4赞 SirJames 2/15/2017
这实际上是一个非常有趣的解决方案 - 我没有意识到这是特别可能的......
2赞 Vasiliy Rusin 2/16/2017
@SirJames,真的很容易。Windows 接受“cls”并忽略其他和 Unix 运行函数,这些函数知道,忽略“cls”
0赞 SirJames 2/17/2017
是的,我知道 cmd prompt 和 bash 可以做的功能......但它只是没有点击我可以在 Python 中轻松做到这一点。
1赞 1/27/2019
很整洁...与pip3 install clear-screen相似
2赞 Arash Hatami 8/23/2016 #20

您可以使用函数来执行终端的命令:call()

from subprocess import call
call("clear")
9赞 OpticalMagician 6/16/2017 #21

所以只是想我会把我的两分钱扔进这里......

似乎没有人对 OP 问题提供真正的答案,每个人要么在没有解释的情况下回答“NO DONT USE os.system() it's evil!!要么提供依赖于打印新行的解决方案。

对于那些需要清除终端屏幕并向后滚动的用户,无论出于何种原因,您都可以使用以下代码:

import os

def clear():
    '''
    Clears the terminal screen and scroll back to present
    the user with a nice clean, new screen. Useful for managing
    menu screens in terminal applications.
    '''
    os.system('cls' if os.name == 'nt' else 'echo -e \\\\033c')

print('A bunch of garbage so we can garble up the screen...')
clear()

# Same effect, less characters...

def clear():
    '''
    Clears the terminal screen and scroll back to present
    the user with a nice clean, new screen. Useful for managing
    menu screens in terminal applications.
    '''
    os.system('cls||echo -e \\\\033c')

这具有 OP 的预期效果。它确实使用了 os.system() 命令,所以如果这是邪恶的,并且有人知道使用 subprocess.call() 实现它的方法,请发表评论,因为我也更喜欢使用 subprocess,但我根本不熟悉它。

评论

1赞 besimple 1/5/2018
这个在 Raspberry Pi 上对我有用。Joril 的回答不会将光标重置到屏幕顶部。
0赞 Xantium 3/6/2018
您可能想签出: stackoverflow.com/questions/18937058/clear-screen-in-shell/...
1赞 OpticalMagician 5/22/2018
@Simon,您的引用不是 OP 要求的跨平台,而是针对 Darwin 设备。是的,在某些 nix 环境中工作,但不是全部,而特定于 Windows 并且适用于所有 Bash 环境'clear''cls''echo -e \\\\033c'
0赞 Xantium 5/22/2018
好吧,对不起。诚然,我在 Windows 上运行,有时在 Ubuntu 上运行,所以我对不同的环境了解不多。
0赞 Charles Duffy 10/30/2021
echo -e是一个非 POSIX 扩展 -- 它根本不能保证被支持,即使你的 shell 100% 保证是 bash,它也可以被关闭(运行 ,然后在输出时打印)。请参阅 echo 的 POSIX 规范,该规范明确建议在需要打印转义序列时改用。set -o posix; shopt -s xpg_echoecho -e-eprintf
11赞 Short 6/25/2017 #22

前段时间遇到这个

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 11/5/2017
我喜欢这个解决方案的便携性。
0赞 Xantium 3/6/2018 #23

公认的答案是一个很好的解决方案。它的问题是到目前为止,它仅适用于 Windows 10、Linux 和 Mac。是的,Windows(以缺乏ANSI支持而闻名)!此新功能是在 Windows 10(及更高版本)上实现的,其中包括 ANSI 支持,但您必须启用它。这将以跨平台的方式清除屏幕:

import os

print ('Hello World')
os.system('') 
print ("\x1B[2J")

但是,在 Windows 10 以下的任何内容上,它都会返回以下内容:

[2J

这是由于以前的 Windows 版本缺乏 ANSI 支持。但是,可以使用 colorama 模块解决此问题。这将在 Windows 上添加对 ANSI 字符的支持:

长期以来,ANSI 转义字符序列一直用于在 Unix 和 Mac 上生成彩色终端文本和光标定位。Colorama 也在 Windows 上实现了这一点,方法是包装 stdout,剥离它找到的 ANSI 序列(在输出中显示为 gobbledygook),并将它们转换为适当的 win32 调用以修改终端的状态。在其他平台上,Colorama 什么都不做。

所以这里有一个跨平台的方法:

import sys

if sys.platform == 'win32':
    from colorama import init
    init()

print('Hello World')

print("\x1B[2J")

或者用 代替 .print(chr(27) + "[2J")print("\x1B[2J")


@poke答案在 Windows 上非常不安全,是的,它有效,但它实际上是一个黑客。与脚本同名或位于同一字典中的文件将与命令冲突并执行文件而不是命令,从而造成巨大的安全隐患。cls.batcls.exe

将风险降至最低的一种方法是更改调用命令的位置:cls

import os
os.system('cd C:\\Windows|cls' if os.name == 'nt' else 'clear')

这会将 Currant Dictionary 更改为(反斜杠在这里很重要),然后执行。 始终存在,并且需要管理权限才能写入该命令,因此非常适合以最小的风险执行此命令。另一种解决方案是通过 PowerShell 而不是命令提示符运行命令,因为它已针对此类漏洞提供保护。C:\WindowC:\Windows

这个问题中还提到了其他方法:在外壳中清除屏幕,这也可能有用。

3赞 Thomas Nilton de Carvalho Vani 4/5/2018 #24

在 Windows 中,您可以使用:

>>> import os
>>> clear = lambda: os.system('cls')
>>> clear()
3赞 Aditya Mishra 4/15/2018 #25

如果您希望在使用 python shell 时清除终端。然后,您可以执行以下操作来清除屏幕

import os
os.system('clear')
31赞 Alex Hawking 6/19/2018 #26

只需使用:

print("\033c")

这将清除终端窗口。

评论

9赞 GG_Python 11/3/2019
此外,在清除控制台时不注入换行符。print("\033c", end="")
2赞 user76284 6/28/2020
这与这个答案有何不同?
1赞 Alex Hawking 6/29/2020
@user76284它更简单(这个答案也像两岁:o)
10赞 Nanhe Kumar 10/23/2018 #27

这将在 Python2 或 Python3 版本中工作

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

评论

3赞 Emma Labbé 2/6/2019
print (u"{}[2J{}[;H".format(chr(27), chr(27)), end="")用于删除换行符。