是否存在任何标准的“附带电池”方法来清除Python脚本中的终端屏幕,或者我必须去诅咒(库,而不是单词)?
当前回答
这将清除25个新行:
def clear():
print(' \n' * 25)
clear()
我在pydev中使用eclipse。我更喜欢换行解决方案比范围内的for num。for循环抛出警告,而打印换行符则不会。 如果您想在clear语句中指定换行数,请尝试此变体。
def clear(j):
print(' \n' * j)
clear(25)
其他回答
公认的答案是一个很好的解决方案。问题是,到目前为止,它只适用于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字符的支持:
在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.bat”或“cls.exe”的文件将与命令发生冲突,并执行该文件而不是命令,从而产生巨大的安全隐患。
一个最小化风险的方法是改变cls命令被调用的位置:
import os
os.system('cd C:\\Windows|cls' if os.name == 'nt' else 'clear')
这将把Currant Dictionary更改为C:\Window(这里反斜杠很重要),然后执行。C:\Windows始终存在,需要管理权限才能在那里写入,这使得它适合以最小的风险执行此命令。另一种解决方案是通过PowerShell而不是命令提示符运行命令,因为PowerShell已经防范了此类漏洞。
在这个问题中还提到了其他方法:在shell中清除屏幕,这也可能是有用的。
前段时间偶然发现的
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, 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测试了打印(“\033c”,end=“”),我在Linux和Windows上测试了它(它不适用于Windows,因此调用cls的其他代码)。我不记得我第一次看到使用print("\033c")和/或printf版本:subprocess.run("printf '\033c'", shell=True)。
Rolika指出,end=""将阻止它随后打印新行。
注意,新版本的Ubuntu会很好地清除屏幕(不只是向下滚动,让它看起来是清除的),不像旧版本。
注意,用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[6q "(大于6的数字似乎也是这样)
还要注意,你可以在Linux上做以下任何事情来清除屏幕:
print("\033c", end=""): print("\u001bc", end="") print("\U0000001bc", end="") print("\x1bc", end="") subprocess.run(["clear"]) #This doesn't reset the whole terminal 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)
我相信下面的代码应该是为了清除你必须向上滚动才能看到的内容(但它很难与另一个命令一起使用而没有问题):
打印('*)
这可以做和clear以前做的一样的事情(所以你可以向上滚动查看被删除的内容,除了它不会将光标上升到顶部):
打印('**)
您可以对terminfo数据库进行分解,但这样做的函数无论如何都是在curses中。
所以我想在这里发表我的意见…
似乎没有人对这个问题提供一个真实的答案,每个人的回答都是“不使用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,但根本不熟悉它。
推荐文章
- 证书验证失败:无法获得本地颁发者证书
- 当使用pip3安装包时,“Python中的ssl模块不可用”
- 无法切换Python与pyenv
- Python if not == vs if !=
- 如何从终端/命令行调用VS代码编辑器
- 如何从scikit-learn决策树中提取决策规则?
- 为什么在Mac OS X v10.9 (Mavericks)的终端中apt-get功能不起作用?
- 将旋转的xtick标签与各自的xtick对齐
- 为什么元组可以包含可变项?
- 如何合并字典的字典?
- 如何创建类属性?
- 不区分大小写的“in”
- 在Python中获取迭代器中的元素个数
- 解析日期字符串并更改格式
- 使用try和。Python中的if