提问人:Stefano Borini 提问时间:1/18/2010 最后编辑:XantiumStefano Borini 更新时间:10/16/2022 访问量:620570
在 Python 中清除终端 [重复]
Clear terminal in Python [duplicate]
问:
是否存在任何标准的“自带电池”方法来清除 Python 脚本中的终端屏幕,或者我是否必须去诅咒(库,而不是单词)?
答:
您可以撕毁 terminfo 数据库,但这样做的函数无论如何都在。curses
转义序列呢?
print(chr(27) + "[2J")
评论
python -c "from os import system; system('clear')"
评论
system('clear')
很可怕吗?我不同意。
rm file
rm -rf /
如果您使用的是 Linux/UNIX 系统,则打印 ANSI 转义序列以清除屏幕应该可以完成这项工作。您还需要将光标移动到屏幕顶部。这将适用于任何支持 ANSI 的终端。
import sys
sys.stderr.write("\x1b[2J\x1b[H")
除非启用了 ANSI 支持,否则这在 Windows 上不起作用。Windows 可能有等效的控制序列,但我不知道。
评论
print
softspace
sys.stdout.flush()
sys.stderr.flush()
print()
import colorama; colorama.init()
使序列也能在 Windows 上运行。"\x1b[2J\x1b[H"
你可以自己做。这不取决于您的终端或操作系统类型。
def clear(num):
for i in range(num): print
clear(80)
print "hello"
评论
一个简单的跨平台解决方案是在 Windows 或 Unix 系统上使用该命令。与 os.system
一起使用,这是一个很好的单行代码:cls
clear
import os
os.system('cls' if os.name == 'nt' else 'clear')
评论
os.system
clear
cls
print("\n" * 100)
cls
cls
cls
clear
clear
cls
system
如果您只需要清除屏幕,这可能就足够了。问题是,在 linux 版本中甚至没有 100% 跨平台的方式来做到这一点。问题是终端的实现都支持略有不同的东西。我相当确定“清除”将在任何地方都有效。但更“完整”的答案是使用 xterm 控制字符来移动光标,但这本身需要 xterm。
在不了解您的问题的情况下,您的解决方案似乎已经足够好了。
您可以尝试依赖 clear,但它可能并非在所有 Linux 发行版上都可用。在 Windows 上使用您提到的 cls。
import subprocess
import platform
def clear():
subprocess.Popen( "cls" if platform.system() == "Windows" else "clear", shell=True)
clear()
注意:控制终端屏幕可能被认为是不好的形式。您是否正在考虑使用选项?最好让用户决定是否要清除屏幕。
评论
os.system
subprocess.call()
一种可能很俗气的清除屏幕的方法,但可以在我所知道的任何平台上使用,如下所示:
for i in xrange(0,100):
print ""
评论
print ('\n' * 100)
这将清除 25 条新行:
def clear():
print(' \n' * 25)
clear()
我将eclipse与pydev一起使用。我更喜欢换行符解决方案,而不是范围内的 for num。for 循环会抛出警告,而 print 换行符不会。 如果要在 clear 语句中指定换行符的数量,请尝试此变体。
def clear(j):
print(' \n' * j)
clear(25)
评论
对于 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)都无关紧要。
评论
def cls(): if platform.system() == "Linux": os.system("clear") elif platform.system() == "Windows": os.system("cls")
默认情况下,/ 将返回 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()
评论
此函数在 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))。 (默认)在交互模式下效果更好。 更适合基于文本的终端应用程序。 添加以尝试在减小终端尺寸后修复交互模式下的毛刺间隙问题,但也可用于终端应用。 只是为了秘密的、“持久”地存储价值;不要显式使用此参数。(如果未为 传递参数,则更改 的列表内容将更改此参数的默认值。因此,持久性存储。rows
rows_max
*,
calling_line=True
calling_line=False
absolute
store_max
rows_max
store_max
store_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.rows
self.rows += 1
print(...)
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
这适用于所有平台,并且在 Python 2 和 3 中都有效。
def clear(number):
for i in range(number):
print(" ")
然后要清除,只需键入 .clear(numberhere)
评论
print(""*100)
对于 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="")
cls
print("\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”)
评论
print("\033c", end="")
如果不想打印换行符
我会以这种方式这样做,使它看起来更像 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)
纯 Python 解决方案。
不依赖于 ANSI 或外部命令。
只有您的终端必须能够告诉您视野中有多少条线。
from shutil import get_terminal_size
print("\n" * get_terminal_size().lines, end='')
Python 版本 >= 3.3.0
评论
为什么没有人谈论只是在 Windows 中简单地做 + 或在 Mac 中做 +。 当然是清除屏幕的最简单方法。CtrlLCmdL
评论
os.system('clear')
至于我,最优雅的变体:
import os
os.system('cls||clear')
评论
您可以使用函数来执行终端的命令:call()
from subprocess import call
call("clear")
所以只是想我会把我的两分钱扔进这里......
似乎没有人对 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,但我根本不熟悉它。
评论
'clear'
'cls'
'echo -e \\\\033c'
echo -e
是一个非 POSIX 扩展 -- 它根本不能保证被支持,即使你的 shell 100% 保证是 bash,它也可以被关闭(运行 ,然后在输出时打印)。请参阅 echo
的 POSIX 规范,该规范明确建议在需要打印转义序列时改用。set -o posix; shopt -s xpg_echo
echo -e
-e
printf
前段时间遇到这个
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 支持。但是,可以使用 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.bat
cls.exe
将风险降至最低的一种方法是更改调用命令的位置:cls
import os
os.system('cd C:\\Windows|cls' if os.name == 'nt' else 'clear')
这会将 Currant Dictionary 更改为(反斜杠在这里很重要),然后执行。 始终存在,并且需要管理权限才能写入该命令,因此非常适合以最小的风险执行此命令。另一种解决方案是通过 PowerShell 而不是命令提示符运行命令,因为它已针对此类漏洞提供保护。C:\Window
C:\Windows
这个问题中还提到了其他方法:在外壳中清除屏幕,这也可能有用。
在 Windows 中,您可以使用:
>>> import os
>>> clear = lambda: os.system('cls')
>>> clear()
如果您希望在使用 python shell 时清除终端。然后,您可以执行以下操作来清除屏幕
import os
os.system('clear')
只需使用:
print("\033c")
这将清除终端窗口。
评论
print("\033c", end="")
这将在 Python2 或 Python3 版本中工作
print (u"{}[2J{}[;H".format(chr(27), chr(27)))
评论
print (u"{}[2J{}[;H".format(chr(27), chr(27)), end="")
用于删除换行符。
上一个:在交互时重新导入模块
评论
clear