在Python中清除终端

是否有任何标准的“自带电池”方法来清除python脚本中的终端屏幕,还是必须去诅咒(图书馆,而不是词)?

什么逃生序列?

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

一个简单而跨平台的解决方案是在Windows上使用cls命令,或者在Unix系统上使用cls命令。 用于os.system ,这是一个很好的一行:

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

为什么没有人只是简单地做Ctrl + L。
当然是清除屏幕最简单的方法。

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

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

除非启用了ANSI支持,否则这将无法在Windows上运行。 Windows可能有一个等效的控制顺序,但我不知道。

作为一个聪明人曾经发布过,至少对于Linux来说,你可以做Python的等价物,你可以在命令行中使用它。 它会比Linux clear命令clear更多的屏幕(例如,你不能向上滚动查看你的文本):

 printf "\033c" 

对于Windows,您可以使用cls

这是一个Python的方式来做到这一点:

 import subprocess subprocess.call(["printf", "'\033c'"]) 

这是另一种Python的方式(至少在我的电脑上):

 print("\033c") 

我不知道这是否适用于Windows或Mac,iOS,Android等。

你可以使用其他人的答案来找出一个更跨平台的方式来实现这一点。

你可以尝试依靠清除,但它可能不适用于所有的Linux发行版。 在Windows上使用CLS,你提到。

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

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

至于我,最优雅的变体:

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

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

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

Python版本> = 3.3.0

这个函数在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的列表内容store_max改变这个参数的默认值,所以持久化存储。

可移植性:对不起,这在IDLE中不起作用,但它在可识别ANSI转义序列的终端(控制台)的交互模式下工作>> VERY COOL <<。 我只在Ubuntu 13.10中使用gnome-terminal中的Python 3.3进行测试。 所以我只能假定可移植性依赖于Python 3.3(用于BEST结果的shutil.get_terminal_size()函数)和ANSI识别。 print(...)函数是Python 3.我还用一个简单的,基于文本的终端井字游戏(应用程序)测试了这个功能。

在交互模式下使用:首先在交互模式下复制并粘贴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文件相同的文件夹中。 下面是一个井字游戏应用程序(从终端提示符:python3 tictactoe .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()重新绘制show_board() ,先前的板子被清除,并且新的板子被准确地打印在应该的位置上。 注意,第9行的self.clear(calling_line=False)基本上把所有的东西都推到相对于终端的底部,但是不清除原来的呼叫线路。 相比之下,第29行的self.clear(absolute=self.rows)绝对清除了所有self.rows距离,而不是只是把所有的东西都向上推到终端的底部。

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

前段时间碰到过这个

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

你可以通过terminfo数据库,但是这样做的功能是在curses无论如何。

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

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

不知道更多的问题,你的解决方案似乎足够好。

这将清除25个新行:

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

我用pydev的日食。 我喜欢换行符比范围内的更好。 for循环会引发警告,而print换行则不会。 如果你想在明确的语句中指定换行符的数量,请尝试使用这个变体。

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

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

 from subprocess import call call("clear") 

所以只是想我会把我的两分钱扔在这里…

没有人提供OP问题的真实答案,似乎每个人都回答“不要使用os.system()它是邪恶的! 没有解释或提供了一个依靠打印新行的解决方案。

对于那些需要清除终端屏幕并回滚的用户,无论出于何种原因,都可以使用以下方式

 import sys 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()实现这个方法请注释,因为我也喜欢使用子进程,但我不熟悉它。

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

 def clear(num): for i in range(num): print clear(80) print "hello" 

一个清理屏幕的方式也许很俗气,但是在我所知的任何平台上都可以运行的方法如下:

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

我会这样做,使其看起来更像bash:

只需在Home目录中创建一个名为.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()”来保留它。

使用它像一个正常的功能应该做的伎俩不打印退出状态:

明确()

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

清除(0)

对于窗口,只在口译命令行上(而不是GUI)! 只要输入:(记得用python使用正确的缩进):

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

每次在shell(COMMAND LINE)上输入clear(),它都会清除你的shell的屏幕。 如果你退出shell,那么当你打开一个新的python(COMMAND LINE)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() 

这适用于所有平台,它应该在Python 2和3工作,但我知道它在2中工作

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

然后清除只需键入clear()