像大多数 Python 开发人员一样,我通常会在运行 Python 解释器以测试命令、dir()
内容、help() stuff
等的情况下打开控制台窗口。
像任何控制台一样,一段时间后,过去命令和打印的可见积压会变得混乱,并且在多次重新运行相同命令时有时会令人困惑。我想知道是否以及如何清除 Python 解释器控制台。
我听说过进行系统调用并在 Windows 上调用 cls
或在 Linux 上调用 clear
,但我希望我可以命令解释器本身执行一些操作。
注意:我在 Windows 上运行,所以 Ctrl+L
不起作用。
正如您所提到的,您可以进行系统调用:
对于 Windows:
>>> import os
>>> clear = lambda: os.system('cls')
>>> clear()
对于 Linux,它将是:
>>> import os
>>> clear = lambda: os.system('clear')
>>> clear()
这里有一些更方便的跨平台的东西
import os
def cls():
os.system('cls' if os.name=='nt' else 'clear')
# now, to clear the screen
cls()
import os
os.system('cls')
cls = lambda: os.system('cls' if os.name=='nt' else 'clear')
好吧,这里有一个快速破解:
>>> clear = "\n" * 100
>>> print clear
>>> ...do some other stuff...
>>> print clear
或者为了节省一些输入,把这个文件放在你的 python 搜索路径中:
# wiper.py
class Wipe(object):
def __repr__(self):
return '\n'*1000
wipe = Wipe()
然后,您可以随心所欲地从解释器中执行此操作:)
>>> from wiper import wipe
>>> wipe
>>> wipe
>>> wipe
"\x1B[H\x1B[J"
clear
和 cls
所做的。这是的方法。 (只是一个打印,或者一个带有打印调用的函数,当然不属于“清除”字符串)
clear
输出一个清除屏幕的指令。不破坏回滚缓冲区。在我的系统上,它输出这个控制序列:\33[3J\33[H\33[2J
。即:[erase scrollback]
[reset cursor position]
[erase screen]
。 [erase scrollback]
可以使用 clear -x
省略。
这是您可以做的最简单的事情,它不需要任何额外的库。它清除屏幕并将 >>>
返回到左上角。
print("\033[H\033[J", end="")
更新 1:
由于这个答案得到了一些关注,您可能想知道它是如何工作的。上面的命令打印 ANSI escape codes:
\033 代表 ESC(ANSI 值 27)。
\033[ 是一个特殊的转义序列,称为控制序列引入器 (CSI)。
\033[H 命令将光标移动到屏幕的左上角。
\033[J 从光标处清屏到屏幕末尾。
可选参数 end=""
避免在执行这些命令后打印换行符,因此 >>>
保留在最顶行。
更新 2:
您可能希望使用一个附加参数来扩展上述命令 - x
(在 J
之前):
print("\033[H\033[xJ", end="")
如果 x 为 1,它将从光标到屏幕开头清除。
如果 x 为 2,它将清除整个屏幕并将光标移动到左上角。
如果 x 为 3,它将清除整个屏幕并删除保存在回滚缓冲区中的所有行。
因此,此命令将清除所有内容,包括缓冲区:
print("\033[H\033[3J", end="")
命令行:
要在 shell(控制台/终端)中清除屏幕,您可以使用相同的命令。要清除整个屏幕并删除保存在回滚缓冲区中的所有行,请将 3 放在 J
之前:
printf "\033[H\033[3J"
或创建别名:
alias cls='printf "\033[H\033[3J"'
print("\033[H\033[J")
这个方法是如何工作的,它的名字是什么!?
在 Windows 上有多种方法:
1.使用键盘快捷键:
Press CTRL + L
2.使用系统调用方法:
import os
cls = lambda: os.system('cls')
cls()
3.使用换行打印100次:
cls = lambda: print('\n'*100)
cls()
cls
只能在 Windows 上运行,并且使您的程序难以跨平台,打印 100 newlines
只是... eww?并且程序中不使用键盘快捷键。
虽然这是一个较老的问题,但我想我会贡献一些东西来总结我认为最好的其他答案,并通过建议您将这些命令放入文件并设置您的 PYTHONSTARTUP 来添加我自己的皱纹指向它的环境变量。由于我目前在 Windows 上,因此这种方式略有偏差,但很容易偏向其他方向。
以下是我发现的一些文章,描述了如何在 Windows 上设置环境变量:
When to use sys.path.append and when modifying %PYTHONPATH% is enough
How To Manage Environment Variables in Windows XP
Configuring System and User Environment Variables
How to Use Global System Environment Variables in Windows
顺便说一句,即使文件中有空格,也不要在文件路径周围加上引号。
无论如何,这是我对放入(或添加到您现有的)Python 启动脚本的代码的看法:
# ==== pythonstartup.py ====
# add something to clear the screen
class cls(object):
def __repr__(self):
import os
os.system('cls' if os.name == 'nt' else 'clear')
return ''
cls = cls()
# ==== end pythonstartup.py ====
顺便说一句,您还可以使用 @Triptych's __repr__
技巧将 exit()
更改为 exit
(其别名 quit
也是如此):
class exit(object):
exit = exit # original object
def __repr__(self):
self.exit() # call original
return ''
quit = exit = exit()
最后,还有一些将主解释器提示从 >>>
更改为 cwd+>>>
的内容:
class Prompt:
def __str__(self):
import os
return '%s >>> ' % os.getcwd()
import sys
sys.ps1 = Prompt()
del sys
del Prompt
__repr__
和/或 __str__
的一个有趣的副作用是,如果您在解释器控制台输入 >>> vars()
,它将执行所有由此定义的命令。例如,在我的系统上,它清除了屏幕,然后退出了控制台。我花了一段时间才弄清楚到底发生了什么......
locals()
和 globals()
。围绕这些函数的简单装饰器删除名称并在函数调用后重新分配它是一种可能的解决方案......
毫无疑问,最快和最简单的方法是 Ctrl+L。
这与终端上的 OS X 相同。
我这样做的方法是编写一个像这样的函数:
import os
import subprocess
def clear():
if os.name in ('nt','dos'):
subprocess.call("cls")
elif os.name in ('linux','osx','posix'):
subprocess.call("clear")
else:
print("\n") * 120
然后调用 clear()
清除屏幕。这适用于 windows、osx、linux、bsd ......所有操作系统。
os.name in ('linux','osx')
,也可能还想添加 'posix'
。
os.name == 'posix'
完美的 cls,也兼容 Python2(在 .pythonrc 文件中):
from __future__ import print_function
cls = lambda: print("\033c", end='')
并且可以通过这种方式从终端调用:
cls()
或直接:
print("\033c", end='')
\033[H\033[J
仅清除可见屏幕,与 Ubuntu 18.10 之前的 clear
命令完全相同。它不会清除回滚缓冲区。向上滚动将显示历史记录。
要模拟此行为,请插入一些终端线,然后按 Ctrl+L
并插入更多。执行print("\033[H\033[J", end="")
后,只会删除按“Ctrl + L”后插入的屏幕行。
\033c
清除所有内容。
\x1bc
可能不会给出与 \033c
相同的结果,因为十六进制转义没有明确的长度限制。
os
并运行外部命令只是为了让屏幕清晰,这是一个过大的 IMO,其次,它要快得多(当然,这只有在你有连续做无数次)
ESC-c
的一些信息:“触发将终端完全重置为其原始状态。[20] 这可能包括(如果适用):重置图形再现、清除制表位、重置为默认字体等。 "
\x
的十六进制转义总是两个十六进制数字。 \x1b
完全等同于 \033
。
这是一个跨平台(Windows / Linux / Mac / 可能是您可以在 if 检查中添加的其他平台)版本片段,我结合了在这个问题中找到的信息:
import os
clear = lambda: os.system('cls' if os.name=='nt' else 'clear')
clear()
同样的想法,但用了一勺语法糖:
import subprocess
clear = lambda: subprocess.call('cls||clear', shell=True)
clear()
Wiper 很酷,它的好处是我不必在它周围输入“()”。这是它的细微变化
# wiper.py
import os
class Cls(object):
def __repr__(self):
os.system('cls')
return ''
用法很简单:
>>> cls = Cls()
>>> cls # this will clear console.
class Cls
的实例命名为 cls
。 cls = Cls()
我不确定 Windows 的“shell”是否支持这一点,但在 Linux 上:
print "\033[2J"
https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes
在我看来,用 os
调用 cls
通常是个坏主意。想象一下,如果我设法更改您系统上的 cls 或 clear 命令,并且您以管理员或 root 身份运行脚本。
这是合并所有其他答案的the definitive solution。特征:
您可以将代码复制粘贴到您的 shell 或脚本中。您可以随意使用它: >>> clear() >>> -clear >>> clear # <- 但这仅适用于 shell 您可以将其作为模块导入: >>> from clear import clear > >> -clear 你可以把它当成一个脚本来调用: $ python clear.py 它是真正的多平台;如果它无法识别您的系统(ce、nt、dos 或 posix),它将退回到打印空白行。
您可以在此处下载 [完整] 文件:https://gist.github.com/3130325
或者,如果您只是在寻找代码:
class clear:
def __call__(self):
import os
if os.name==('ce','nt','dos'): os.system('cls')
elif os.name=='posix': os.system('clear')
else: print('\n'*120)
def __neg__(self): self()
def __repr__(self):
self();return ''
clear=clear()
使用空闲。它有许多方便的功能。例如,Ctrl+F6 重置控制台。关闭和打开控制台是清除它的好方法。
F6
不会重置空闲控制台,但 CTRL+F6
会。不幸的是,这不会清除屏幕。 D'oh!(Python Win32 Idle 版本 2.6.2、2.7.1、3.2)。
我在 Windows XP、SP3 上使用 MINGW/BASH。
(把它放在 .pythonstartup 中)# 我的 ctrl-l 已经有点用了,但这可能对其他人有所帮助
这在 BASH 中有效,因为我在 .inputrc 中也有它,但是由于某些原因,当我进入 Python 时它会被丢弃 readline.parse_and_bind('\Cy: kill-whole-line')
我再也无法忍受输入 'exit()' 并且对 martineau/Triptych 的技巧感到高兴:
我稍微修改了一下(卡在 .pythonstartup 中)
class exxxit():
"""Shortcut for exit() function, use 'x' now"""
quit_now = exit # original object
def __repr__(self):
self.quit_now() # call original
x = exxxit()
Py2.7.1>help(x)
Help on instance of exxxit in module __main__:
class exxxit
| Shortcut for exit() function, use 'x' now
|
| Methods defined here:
|
| __repr__(self)
|
| ----------------------------------------------------------------------
| Data and other attributes defined here:
|
| quit_now = Use exit() or Ctrl-Z plus Return to exit
Linux 中的操作系统命令 clear
和 Windows 中的 cls
输出一个“魔术字符串”,您可以打印它。要获取字符串,请使用 popen 执行命令并将其保存在变量中以供以后使用:
from os import popen
with popen('clear') as f:
clear = f.read()
print clear
在我的机器上,字符串是 '\x1b[H\x1b[2J'
。
\x1b[H
表示“将光标移动到左上角”,\x1b[2J
表示“清除所有屏幕”。 2) 在 Windows 中,ANSI 无法识别,因此可能没有任何魔术字符串。
我是 python 的新手(真的很新),并且在我正在阅读的一本书中熟悉他们教如何创建这个小函数来清除控制台中可见的积压和过去的命令和打印的语言:
打开shell/新建文档/创建函数如下:
def clear():
print('\n' * 50)
将它保存在 python 目录中的 lib 文件夹中(我的是 C:\Python33\Lib) 下次您需要清除控制台时,只需调用该函数:
clear()
而已。 PS:您可以随意命名您的功能。我看到人们使用“wiper”“wipe”和变体。
>>> ' '*80*25
更新:80x25 不太可能是控制台窗口的大小,因此要获得真正的控制台尺寸,请使用 pager 模块中的函数。 Python 没有提供与核心发行版类似的任何东西。
>>> from pager import getheight
>>> '\n' * getheight()
就用这个..
print '\n'*1000
这里有两种很好的方法:
1.
import os
# Clear Windows command prompt.
if (os.name in ('ce', 'nt', 'dos')):
os.system('cls')
# Clear the Linux terminal.
elif ('posix' in os.name):
os.system('clear')
2.
import os
def clear():
if os.name == 'posix':
os.system('clear')
elif os.name in ('ce', 'nt', 'dos'):
os.system('cls')
clear()
如果它在 mac 上,那么一个简单的 cmd + k
应该可以解决问题。
Arch Linux(在 xfce4-terminal
中使用 Python 3 测试):
# Clear or wipe console (terminal):
# Use: clear() or wipe()
import os
def clear():
os.system('clear')
def wipe():
os.system("clear && printf '\e[3J'")
... 添加到 ~/.pythonrc
clear() 清屏
擦除()擦除整个终端缓冲区
这应该是跨平台的,并且还根据 the os.system
docs 使用首选 subprocess.call
而不是 os.system
。应该在 Python >= 2.4 中工作。
import subprocess
import os
if os.name == 'nt':
def clearscreen():
subprocess.call("cls", shell=True)
return
else:
def clearscreen():
subprocess.call("clear", shell=True)
return
这个怎么样
- os.system('cls')
这是尽可能短的!
What about Linux? It throws "cls command not found"
好的,所以这是一个技术含量低得多的答案,但我使用的是 Notepad++ 的 Python 插件,结果你可以通过右键单击控制台并单击“清除”来手动清除控制台。希望这可以帮助那里的人!
我发现最简单的方法就是关闭窗口并运行模块/脚本来重新打开 shell。
我正在使用 Spyder (Python 2.7) 并清理我使用的解释器控制台
%清除
这会强制命令行转到顶部,我不会看到以前的旧命令。
或者我在控制台环境中单击“选项”并选择“重新启动内核”以删除所有内容。
上面提到了魔术字符串 - 我相信它们来自 terminfo 数据库:
http://www.google.com/?q=x#q=terminfo
http://www.google.com/?q=x#q=tput+command+in+unix
$ tput clear| od -t x1z
0000000 1b 5b 48 1b 5b 32 4a >.[H.[2J<
0000007
编辑:我刚刚读过“windows”,这是为linux用户准备的,对不起。
在 bash 中:
#!/bin/bash
while true; do
clear
"$@"
while [ "$input" == "" ]; do
read -p "Do you want to quit? (y/n): " -n 1 -e input
if [ "$input" == "y" ]; then
exit 1
elif [ "$input" == "n" ]; then
echo "Ok, keep working ;)"
fi
done
input=""
done
将其保存为“whatyouwant.sh”,chmod +x 然后运行:
./whatyouwant.sh python
或python以外的东西(空闲,随便)。这将询问您是否真的要退出,如果不是,它会重新运行 python(或您作为参数提供的命令)。
这将清除所有屏幕和所有变量/对象/您在 python 中创建/导入的任何内容。
在 python 中,当您想退出时,只需键入 exit()。
如果您在 .inputrc 中使用 vim 键绑定:
set editing-mode vi
它的:
ESC Ctrl-L
def
有什么问题?当def
更清晰时,为什么还要使用lambda
?clear = lambda: os.system('cls') or None