在Python中清除终端

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

561021 次浏览

你可以分解terminfo数据库,但这样做的函数无论如何都在curses中。

转义序列呢?

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

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

如果您使用的是Linux/UNIX系统,那么打印ANSI转义序列以清除屏幕就可以了。您还需要将光标移动到屏幕的顶部。这将在任何支持ANSI的终端上工作。

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

这将不能在Windows上工作,除非ANSI支持已启用。Windows可能有一个等效的控制序列,但我不知道。

你可以自己做。这将不依赖于你的终端,或操作系统类型。

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


clear(80)
print "hello"

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

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

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

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

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

import subprocess
import platform


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


clear()

注意:控制终端屏幕可能被认为是一种糟糕的形式。你在考虑使用期权吗?让用户自己决定是否要清除屏幕可能会更好。

清除屏幕的方法可能有些俗气,但在我所知的任何平台上都适用,如下:

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

这将清除25个新行:

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


clear()
我在pydev中使用eclipse。我更喜欢换行解决方案比对于范围内的num循环抛出警告,而print换行符则不会。 如果你想在clear语句中指定换行数,请尝试以下变化
def clear(j):
print(' \n' * j)


clear(25)

对于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)。

默认情况下,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()

这个函数在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

参数:rows是在提示符和终端底部之间添加的明文行数,将所有内容向上推。rows_max是文本行中终端的高度(或最大清除高度),只需要设置一次,但可以随时重置。*,在第三个参数位置意味着所有下面的参数都是关键字(例如,clear(absolute=5))。calling_line=True(默认)在交互模式下工作得更好。calling_line=False更适合于基于文本的终端应用程序。absolute被添加,以尝试在减少终端尺寸后修复交互模式下的故障间隙问题,但也可以用于终端应用。store_max只是用于秘密的“持久”存储rows_max值;不要显式地使用这个参数。(当没有为store_max传递参数时,更改store_max的列表内容将更改此参数的默认值。因此,持久化存储。)

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

在互动模式下使用:首先在交互模式下复制并粘贴copy(...)函数,看看它是否适合你。如果是,那么将上面的函数放到一个名为clear.py的文件中。在终端中启动python,使用'python3'。输入:

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

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

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

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

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行上的do_print(...)print(...)的一个版本,用于跟踪打印了多少行(self.rows)。否则,你将不得不在整个程序中调用print(...)的所有地方self.rows += 1。因此,每次通过调用show_board()重绘板子时,先前的板子将被清除,新的板子将精确地打印在它应该在的位置。注意第9行上的self.clear(calling_line=False)基本上将所有内容相对地推到终端的底部,但不清除原始的调用行。相比之下,第29行上的self.clear(absolute=self.rows)绝对清除了向上self.rows距离的所有内容,而不是仅仅将所有内容相对于终端底部向上推。

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

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

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

然后只需输入clear(numberhere)来清除。

对于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使用clear可以很好地清除屏幕(不只是向下滚动,让它看起来被清除),不像旧版本。

注意,用ESC c (" \033c")重置终端将使光标下划线和闪烁。如果你不想这样,你可以使用这些代码将其更改为另一种风格(在GNOME Terminal 3.44.0上测试,使用VTE 0.68 +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上做以下任何事情来清除屏幕:

  • 打印(“\ 033 c",结束=“;”):
  • print(“\ u001bc"结束=“”)
  • print(“\ U0000001bc"结束=“”)
  • print(“\ x1bc"结束=“”)
  • 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)

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

  • 033年(“\ [3 j")

这可以做与clear以前做的相同的事情(所以你可以向上滚动查看被删除的内容,除了它不会将光标上升到顶部):

  • 033年(“\ [2 j")

我将这样做,使它看起来更像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

你可以在你的./bashrc文件中添加export PYTHONSTARTUP=$HOME/.pythonstartup

因为我关心的是空间;调用该函数将不会在启动时显示python解释器描述,但您可以删除clear()以保留它。

像使用普通函数一样使用它应该不会打印退出状态:

>>> clear()

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

>>> clear(0)

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

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

Python版本>= 3.3.0

为什么没有人谈论在Windows中简单地执行Ctrl+l或在Mac中简单地执行Cmd+l。 这无疑是清除屏幕的最简单方法

对我来说,最优雅的说法是:

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

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

from subprocess import call
call("clear")

所以我想在这里发表我的意见…

似乎没有人对这个问题提供一个真实的答案,每个人的回答都是“不使用os.system()这是邪恶的!!”没有解释,也没有提供依赖于打印新行的解决方案。

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

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,但根本不熟悉它。

前段时间偶然发现的

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

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

import os


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

在任何低于Windows 10的系统上,它会返回这个:

[2J

这是由于在以前的Windows版本中缺乏ANSI支持。然而,这可以使用彩色光模块来解决。这增加了对Windows上ANSI字符的支持:

在Unix和mac上,ANSI转义字符序列长期用于生成彩色终端文本和光标定位。Colorama也在Windows上实现了这一点,它通过包装stdout,剥离它找到的ANSI序列(在输出中作为官书),并将它们转换为适当的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更改为C:\Window(这里反斜杠很重要),然后执行。C:\Windows始终存在,需要管理权限才能在那里写入,这使得它很适合以最小的风险执行此命令。另一种解决方案是通过PowerShell而不是命令提示符运行命令,因为PowerShell已经防范了此类漏洞。

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

在Windows中,您可以使用:

>>> import os
>>> clear = lambda: os.system('cls')
>>> clear()

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

import os
os.system('clear')

只使用:

print("\033c")

这将清除终端窗口。

这将在Python2或Python3两个版本中工作

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