ChatGPT解决这个技术问题 Extra ChatGPT

如何清除解释器控制台?

像大多数 Python 开发人员一样,我通常会在运行 Python 解释器以测试命令、dir() 内容、help() stuff 等的情况下打开控制台窗口。

像任何控制台一样,一段时间后,过去命令和打印的可见积压会变得混乱,并且在多次重新运行相同命令时有时会令人困惑。我想知道是否以及如何清除 Python 解释器控制台。

我听说过进行系统调用并在 Windows 上调用 cls 或在 Linux 上调用 clear,但我希望我可以命令解释器本身执行一些操作。

注意:我在 Windows 上运行,所以 Ctrl+L 不起作用。

此处的 IPython 解决方案:stackoverflow.com/questions/6892191/…

M
Merouane T.

正如您所提到的,您可以进行系统调用:

对于 Windows:

>>> import os
>>> clear = lambda: os.system('cls')
>>> clear()

对于 Linux,它将是:

>>> import os
>>> clear = lambda: os.system('clear')
>>> clear()

在常规函数中定义它而不是 lambda 不应显示“0”,因为返回值为 None。
使用 def 有什么问题?当 def 更清晰时,为什么还要使用 lambda
@Akbaribrahim 因为 None 不会被打印试试这个:clear = lambda: os.system('cls') or None
如何使它持续存在于 python 解释器的实例上?提前致谢。
os.system 已弃用。改用 subprocess.call
r
rubenvb

这里有一些更方便的跨平台的东西

import os

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

# now, to clear the screen
cls()

处理事情的好方法,结合上面的 lambda 建议来节省一行代码,非常方便!谢谢! :)
import os os.system('cls')
未设置 TERM 环境变量。
cls = lambda: os.system('cls' if os.name=='nt' else 'clear')
K
Kenan Banks

好吧,这里有一个快速破解:

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

哈哈,还蛮好笑的。不完全是我想要的,但很好的尝试。
@Triptych:c = "\n" * 100 有用,+1。它清除并带到外壳底部的一个小注释,我更喜欢从外壳顶部开始。
或者,如果您的终端仿真器解释 ANSI,最好这样做:"\x1B[H\x1B[J"
尽管人们笑了,但打印大量换行符正是外部进程 clearcls 所做的。这的方法。 (只是一个打印,或者一个带有打印调用的函数,当然不属于“清除”字符串)
@jsbueno 不,不是。好吧,也许在 Windows 上(虽然我对此表示怀疑,但它具有清除控制台的 API)。在所有其他系统上,clear 输出一个清除屏幕的指令。不破坏回滚缓冲区。在我的系统上,它输出这个控制序列:\33[3J\33[H\33[2J。即:[erase scrollback] [reset cursor position] [erase screen][erase scrollback] 可以使用 clear -x 省略。
D
Denis Rasulev

这是您可以做的最简单的事情,它不需要任何额外的库。它清除屏幕并将 >>> 返回到左上角。

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"'

这样做的好处是它也适用于 Spyder。
请问这是什么?
哦,我不清楚。我的意思是print("\033[H\033[J")这个方法是如何工作的,它的名字是什么!?
这确实是最好的解决方案。简单和多平台。
这是问题的唯一真正解决方案
V
Vlad Bezden

在 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?并且程序中不使用键盘快捷键。
C
Community

虽然这是一个较老的问题,但我想我会贡献一些东西来总结我认为最好的其他答案,并通过建议您将这些命令放入文件并设置您的 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

这可能是最好的答案 - 其他答案的技术组合。 PYTHONSTARTUP + repr + os.system('cls')。非常好。
@Triptych:以这种方式使用 __repr__ 和/或 __str__ 的一个有趣的副作用是,如果您在解释器控制台输入 >>> vars(),它将执行所有由此定义的命令。例如,在我的系统上,它清除了屏幕,然后退出了控制台。我花了一段时间才弄清楚到底发生了什么......
有趣的。我看到这个问题也适用于 locals()globals()。围绕这些函数的简单装饰器删除名称并在函数调用后重新分配它是一种可能的解决方案......
@Triptych:装饰器的想法似乎行不通,至少我自己的尝试是这样。想出一个可行的替代方案被证明是非常困难的。
我有一个候选解决方案,它只是临时调整 vars() globals() 和 locals() 调用的结果:gist.github.com/4172781
A
Alex K

毫无疑问,最快和最简单的方法是 Ctrl+L。

这与终端上的 OS X 相同。


我在 Windows 8.1 上使用带有 ctrl 键的大写或小写“L”尝试了此解决方案。它对我不起作用。我只是打开和关闭 shell 窗口来清除它。
在 OS X 上,Ctrl+L 将填充终端直到显示清晰。您仍然可以向上滚动查看历史记录。使用 Cmd+K 清除显示和打印历史。 A more complete list of OS X terminal hotkeys
E
EgMusic

我这样做的方法是编写一个像这样的函数:

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'
@rsanden 'linux' 和 'osx' 几乎涵盖了人们实际使用的所有操作系统。
我在 python 2.7.9 和 3.4.3 中运行 Ubuntu 15.04 和 os.name == 'posix'
@rsanden 添加了 posix。
M
Mario Palumbo

完美的 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,其次,它要快得多(当然,这只有在你有连续做无数次)
你为什么在这里使用 lambda?
关于 ESC-c 的一些信息:“触发将终端完全重置为其原始状态。[20] 这可能包括(如果适用):重置图形再现、清除制表位、重置为默认字体等。 "
@not2qubit 是实现功能的快捷方式,这种快捷方式不是强制性的,标准的也很优秀。
根据定义,使用 \x 的十六进制转义总是两个十六进制数字。 \x1b 完全等同于 \033
P
Pitto

这是一个跨平台(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()

A
Amol

Wiper 很酷,它的好处是我不必在它周围输入“()”。这是它的细微变化

# wiper.py
import os
class Cls(object):
    def __repr__(self):
        os.system('cls')
        return ''

用法很简单:

>>> cls = Cls()
>>> cls # this will clear console.

我将 class Cls 的实例命名为 clscls = Cls()
除了用两件事而不是一件事污染初始命名空间之外……两倍。
@Amol 我在 my solution 中使用了您和其他人的技术。您可以先执行 class cls,然后执行 cls=cls()
B
BuZz

我不确定 Windows 的“shell”是否支持这一点,但在 Linux 上:

print "\033[2J"

https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes

在我看来,用 os 调用 cls 通常是个坏主意。想象一下,如果我设法更改您系统上的 cls 或 clear 命令,并且您以管理员或 root 身份运行脚本。


我同意 cls 在这种情况下并不理想,并且 ANSI 转义序列更好。特别是使用 os 调用一个新进程是一个相当昂贵的操作,与将几个字节推送到 stdout 相比。
A
Alba Mendez

这是合并所有其他答案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()

A
AndyG

使用空闲。它有许多方便的功能。例如,Ctrl+F6 重置控制台。关闭和打开控制台是清除它的好方法。


你如何在空闲时做到这一点?只是关闭并重新打开?
不,F6 不会重置空闲控制台,但 CTRL+F6 会。不幸的是,这不会清除屏幕。 D'oh!(Python Win32 Idle 版本 2.6.2、2.7.1、3.2)。
A
AAAfarmclub

我在 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

l
larsr

Linux 中的操作系统命令 clear 和 Windows 中的 cls 输出一个“魔术字符串”,您可以打印它。要获取字符串,请使用 popen 执行命令并将其保存在变量中以供以后使用:

from os import popen
with popen('clear') as f:
    clear = f.read()

print clear

在我的机器上,字符串是 '\x1b[H\x1b[2J'


1) 那个魔术字符串是一个 ANSI sequence\x1b[H 表示“将光标移动到左上角”,\x1b[2J 表示“清除所有屏幕”。 2) 在 Windows 中,ANSI 无法识别,因此可能没有任何魔术字符串。
凉爽的!此外,对于 python3 print('\x1b[H\x1b[2J', end='');可以帮助避免前面的新行。
魔术字符串在 Microsoft Windows 10 控制台和 Python 3.6 上为我工作。我加了字符串序列而不是使用 with open。
K
Kirk

我是 python 的新手(真的很新),并且在我正在阅读的一本书中熟悉他们教如何创建这个小函数来清除控制台中可见的积压和过去的命令和打印的语言:

打开shell/新建文档/创建函数如下:

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

将它保存在 python 目录中的 lib 文件夹中(我的是 C:\Python33\Lib) 下次您需要清除控制台时,只需调用该函数:

clear()

而已。 PS:您可以随意命名您的功能。我看到人们使用“wiper”“wipe”和变体。


a
anatoly techtonik
>>> ' '*80*25

更新:80x25 不太可能是控制台窗口的大小,因此要获得真正的控制台尺寸,请使用 pager 模块中的函数。 Python 没有提供与核心发行版类似的任何东西。

>>> from pager import getheight
>>> '\n' * getheight()

该规则是为了避免简单地发布代码。它试图让人们解释他的答案,而不仅仅是给出代码。
无论如何,这不是一个好的答案——它只是打印一个 80*25 空格的字符串……这仅在控制台为 2000 个字符或更小(例如 80x25 或 100x20……)时才有效……但控制台通常在我的机器。
使用 pypi.python.org/pypi/pager getwidth/getheight 检测控制台参数。
u
user1474157

就用这个..

print '\n'*1000


J
James Jithin

这里有两种很好的方法:

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

如果 os.name 不是这些,为什么不回退到打印空行呢?
如果是 Jython,那么我想让你知道 os.name = 'java'
看起来不错,是不是意味着程序可以变成跨平台了?
J
Jagoda Gorus

如果它在 mac 上,那么一个简单的 cmd + k 应该可以解决问题。


V
Victoria Stuart

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

擦除()擦除整个终端缓冲区


A
Acorn

这应该是跨平台的,并且还根据 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

B
Bo Persson

这个怎么样

- os.system('cls')

这是尽可能短的!


是的,但不是多平台的,每次要清除屏幕时都必须重新输入。
What about Linux? It throws "cls command not found"
g
guest12345

好的,所以这是一个技术含量低得多的答案,但我使用的是 Notepad++ 的 Python 插件,结果你可以通过右键单击控制台并单击“清除”来手动清除控制台。希望这可以帮助那里的人!


S
Seymour

我发现最简单的方法就是关闭窗口并运行模块/脚本来重新打开 shell。


Y
Youness

我正在使用 Spyder (Python 2.7) 并清理我使用的解释器控制台

%清除

这会强制命令行转到顶部,我不会看到以前的旧命令。

或者我在控制台环境中单击“选项”并选择“重新启动内核”以删除所有内容。


S
Someone_who_likes_SE

上面提到了魔术字符串 - 我相信它们来自 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

t
tripleee

编辑:我刚刚读过“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()。


S
Spartan

如果您在 .inputrc 中使用 vim 键绑定:

set editing-mode vi

它的:

ESC Ctrl-L