清空Python终端

269

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

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

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

1

如果你只需要清除屏幕,这可能已经足够了。问题是即使在 Linux 版本之间,也没有一种 100% 的跨平台方式来做到这一点。问题在于终端的实现都支持略微不同的东西。我相当确定 "clear" 在任何地方都可以工作。但更 "完整" 的答案是使用 xterm 控制字符移动光标,但这需要 xterm 本身。

如果不知道你的问题更多信息,你的解决方案似乎已经足够了。


0

被接受的答案是一个好的解决方案。问题在于它目前只能在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通过包装stdout,在其中查找并剥离ANSI序列(这些序列将出现在输出中的乱码),并将它们转换为适当的win32调用以修改终端的状态,从而使其在Windows上也能够正常工作。在其他平台上,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上非常不安全,是一种hack方法。如果与脚本相同目录下存在名为cls.batcls.exe的文件,则会与命令冲突并执行该文件,从而产生巨大的安全隐患。

减少风险的一种方法可能是更改调用cls命令的位置:

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

这将更改当前字典到 C:\Window(反斜杠在此处很重要),然后执行。 C:\Windows 始终存在并需要管理员权限才能在那里写入,从而使其成为使用最小风险执行此命令的好方法。另一种解决方案是通过 PowerShell 而不是命令提示符运行命令,因为它已经针对此类漏洞进行了保护。

此问题中还提到了其他方法:清除 shell 中的屏幕,这也可能会有用。


0
清除屏幕的方法可能有点老套,但是我知道的任何平台都可以使用以下方法:
for i in xrange(0,100):
    print ""

它会将光标留在窗口末尾。这也使得可以向前滚动查看先前的内容。这可能是好事,也可能不是。此外,你可能希望输入更大的数字,因为某些用户可能会使用超过100行...;) - Rod
5
你也可以写成 print ('\n' * 100),这在 Python 2.x 和 3.x 中都能运行并且更快。 - Noctis Skytower

0

对于 Windows 系统,在解释器命令行中(而非 GUI)!只需键入: (请记得使用 Python 的适当缩进):

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

每次在shell(命令行)上键入clear(),它都会清除您的shell屏幕。如果您退出shell,则必须重新执行上述操作,以便在打开新的Python(命令行)shell时再次执行。
注意:无论您使用哪个版本的Python,都不重要(2.5、2.7、3.3和3.4)。

3
可以结合platform.system()方法获取当前操作系统的信息,从而针对不同的操作系统设置清屏命令。以下是一个名为cls()的函数示例:def cls(): if platform.system() == "Linux": os.system("clear") elif platform.system() == "Windows": os.system("cls") - m3nda

0

我会这样做,让它看起来更像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)

-3

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

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

#clear()

2
超过2年前的答案已经有了重复,而且更长更不优雅。请参考@poke回答此问题中得票最高的答案。 - Joop

-6

这适用于所有平台,并且在Python 2和3中都可以工作。

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

然后只需键入clear(数字)即可清除。


1
循环比只是打印 print(""*100) 要慢。而且没必要打印空格。 - Remigiusz Schoida
1
这会在终端上打印空格而不是清除它。 - san1512

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