清除 Python 中的终端[重复]
- 2024-12-09 08:31:00
- admin 原创
- 87
问题描述:
是否存在任何标准的“自带电池”方法来清除 Python 脚本中的终端屏幕,或者我必须去curses(库,而不是单词)?
解决方案 1:
一种简单的跨平台解决方案是cls
在 Windows 或clear
Unix 系统上使用命令。与 一起使用os.system
,这会形成一个很好的单行代码:
import os
os.system('cls' if os.name == 'nt' else 'clear')
解决方案 2:
使用转义序列:
print(chr(27) + "[2J")
解决方案 3:
在 Windows 中 只需输入Ctrl
+ ,在 Mac 中输入+ 。L
`Cmd`L
这确实是清除屏幕最简单的方法。
解决方案 4:
对我来说,最优雅的变体是:
import os
os.system('cls||clear')
解决方案 5:
对于 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("c", end="")
else:
subprocess.run(["cls"])
else: #Linux and Mac
print("c", end="")
jamesnotjimprint("c", end="")
针对 Mac 进行了测试,而我在 Linux 和 Windows 上对其进行了测试(它不适用于 Windows,因此需要调用其他代码cls
)。我不记得是谁第一次看到使用print("c")
和/或 printf 版本:subprocess.run("printf 'c'", shell=True)
。
rolika 指出这end=""
将阻止它随后打印新行。
clear
请注意,与旧版本不同,较新版本的 Ubuntu 可以使用 清除屏幕(而不仅仅是向下滚动以使其看起来被清除) 。
请注意,使用 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”,结束=“”):
打印(“/u001bc”,结束=“”)
打印(“\U0000001bc”,结束=“”)
打印(“c”,结束=“”)
subprocess.run(["clear"]) #这不会重置整个终端
子进程.运行('echo -ne“\033c”',shell = True)
子进程.run('echo -ne“\ec”',shell = True)
子进程.run('echo -ne“/u001bc”',shell = True)
子进程.run('echo -ne“\U0000001bc”',shell = True)
子进程.run('echo -ne“c”',shell = True)
子进程.运行(“printf'\033c'”,shell=True)
子进程.运行(“printf'\ec'”,shell=True)
子进程.运行(“printf'/u001bc'”,shell=True)
子进程.运行(“printf'\U0000001bc'”,shell=True)
子进程.运行(“printf'c'”,shell=True)
我相信以下代码应该可以清除您必须向上滚动才能看到的内容(但很难与另一个命令结合使用而不会出现问题):
打印(“\033[3J”)
这可以做与以前相同的事情clear
(因此您可以向上滚动查看已删除的内容,只是它不会将光标提升到顶部):
打印(“\033[2J”)
解决方案 6:
如果您使用的是 Linux/Unix 系统,则打印ANSI 转义序列以清除屏幕应该可以完成此任务。您还需要将光标移动到屏幕顶部。这适用于任何支持 ANSI 的终端。
import sys
sys.stderr.write("x1b[2Jx1b[H")
除非启用了 ANSI 支持,否则这在 Windows 上不起作用。Windows 上可能有等效的控制序列,但我不知道。
解决方案 7:
只需使用:
print("c")
这将清除终端窗口。
解决方案 8:
这将在 Python2 或 Python3 版本中起作用
print (u"{}[2J{}[;H".format(chr(27), chr(27)))
解决方案 9:
您可以尝试使用 clear,但它可能并非在所有 Linux 发行版上都可用。在 Windows 上,请使用您提到的cls 。
import subprocess
import platform
def clear():
subprocess.Popen("cls" if platform.system() == "Windows" else "clear", shell=True)
clear()
注意:控制终端屏幕可能被认为是不好的做法。您是否考虑使用选项?让用户决定是否要清除屏幕可能更好。
解决方案 10:
我前段时间遇到过这个问题:
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('
' * numlines)
然后只需使用 clearscreen()。
解决方案 11:
似乎没有人对 OP 的问题给出真正的答案。每个人要么回答“不,不要使用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() 来实现。
解决方案 12:
纯Python 解决方案。
它不依赖于ANSI或外部命令。
只有您的终端才有能力告诉您有多少行可见。
from shutil import get_terminal_size
print("
" * get_terminal_size().lines, end='')
Python 版本 3.3.0 或更高版本。
解决方案 13:
该函数在GNOME终端中有效,因为它默认识别ANSI 转义序列。它不仅为您提供了与终端底部干净的提示 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 = ('[1A' + ' ' * 30 if calling_line else '') + linesep * rows
else:
s = '[{}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 + '[{}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(Saucy Salamander)中使用 gnome-terminal 中的 Python 3.3 测试了这一点。所以我只能假设可移植性依赖于 Python 3.3(对于最佳shutil.get_terminal_size()
结果的函数)和 ANSI 识别。该函数是 Python 3。我还用一个简单的、基于文本的终端井字游戏(应用程序)测试了这一点。print(...)
在交互模式下使用:首先在交互模式下复制并粘贴该copy(...)
函数,看看它是否适合您。如果是这样,则将上述函数放入名为clear.py的文件中。在终端中,使用“python3”启动 Python 解释器。输入:
>>> 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
在终端应用程序中使用:将函数放入名为 clear.py 的文件中,该文件与主.py 文件copy(...)
位于同一文件夹中。以下是井字游戏应用程序的一个工作抽象(骨架)示例(从终端提示符运行: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(...)
的版本。否则,您将不得不在整个程序中到处调用 。因此,每次通过调用重新绘制板时,都会清除前一个板,并将新板打印到应在的位置。请注意,第 9 行基本上将所有东西相对于终端底部向上推,但不会清除原始调用行。相比之下,第 29 行绝对清除所有距离向上的东西,而不仅仅是将所有东西相对于终端底部向上推。print(...)
`self.rowsself.rows += 1
print(...)show_board()
self.clear(calling_line=False)self.clear(absolute=self.rows)
self.rows`
使用 Python 3.3 的 Ubuntu 用户:#!/usr/bin/env python3
在 tictactoe.py 文件的第一行输入 。右键单击 tictactoe.py 文件 => 属性 => 权限选项卡 => 勾选执行:允许将文件作为程序执行。双击文件 => 点击在终端中运行按钮。如果打开的终端的当前目录是 tictactoe.py 文件的目录,您也可以使用 启动该文件./tictactoe.py
。
解决方案 14:
如果你在使用 Python shell 时想要清除终端,那么你可以执行以下操作来清除屏幕
import os
os.system('clear')
解决方案 15:
在 Windows 中,您可以使用:
>>> import os
>>> clear = lambda: os.system('cls')
>>> clear()
解决方案 16:
您可以使用该call()
函数执行终端的命令:
from subprocess import call
call("clear")
解决方案 17:
您可以彻底检查terminfo数据库,但是这样做的功能curses
无论如何都是无效的。
解决方案 18:
接受的答案是一个很好的解决方案。问题是,到目前为止,它仅适用于 Windows 10、Linux 和 Mac。是的,Windows(以缺乏 ANSI 支持而闻名)!此新功能已在包含 ANSI 支持的 Windows 10(及更高版本)上实现,尽管您必须启用它。这将以跨平台方式清除屏幕:
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 序列(在输出中会显示为乱码),并将它们转换为适当的 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')
这会将C urrant字典更改为C:Window
(此处反斜杠很重要),然后执行。 C:Windows
始终存在,并且需要管理权限才能写入,因此执行此命令时风险最小。另一种解决方案是通过 PowerShell 而不是命令提示符运行命令,因为它已针对此类漏洞进行了保护。
这个问题中还提到了其他方法:在 shell 中清除屏幕也可能有用。
解决方案 19:
您可以自行制作。这将不依赖于您的终端或操作系统类型。
def clear(num):
for i in range(num): print
clear(80)
print "hello"
解决方案 20:
如果您只需要清除屏幕,那么这可能就足够了。问题是,在 Linux 版本之间甚至没有 100% 跨平台的方法来实现这一点。问题是终端的实现都支持略有不同的东西。我相当肯定“清除”在任何地方都有效。但更“完整”的答案是使用xterm控制字符来移动光标,但这需要 xterm 本身。
在不进一步了解您的问题的情况下,您的解决方案似乎已经足够好了。
解决方案 21:
这将清除 25 条新行:
def clear():
print('
' * 25)
clear()
我使用Eclipse和PyDev。我更喜欢换行符解决方案for num in range
。for循环会抛出警告,而 print newline 不会。如果您想在 clear 语句中指定换行符的数量,请尝试此变体。
def clear(j):
print('
' * j)
clear(25)
解决方案 22:
对于 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)。
解决方案 23:
我会这样做,使它看起来更像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)
解决方案 24:
清除屏幕的方法可能比较俗气,但可以在我所知道的任何平台上使用,方法如下:
for i in xrange(0,100):
print ""
解决方案 25:
默认情况下,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()
解决方案 26:
这适用于所有平台,并且在 Python 2 和 3 中都有效。
def clear(number):
for i in range(number):
print(" ")
然后要清除只需输入clear(numberhere)
。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理必备:盘点2024年13款好用的项目管理软件