【问题标题】:How to clear the interpreter console?如何清除解释器控制台?
【发布时间】:2010-10-05 19:14:15
【问题描述】:

像大多数 Python 开发人员一样,我通常会打开一个控制台窗口,运行 Python 解释器来测试命令、dir() 东西、help() stuff 等。

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

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

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

【问题讨论】:

标签: python windows console


【解决方案1】:

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

>>> 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 省略。
【解决方案2】:

正如你所说,你可以做一个系统调用:

对于 Windows:

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

对于 Linux,它将是:

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

【讨论】:

  • 这个答案最接近我所要求的“精神”,谢谢。
  • +1,很好的答案。有没有办法使用返回值使其不显示?跑干净后我得到一个“0”。
  • 在常规函数中定义它而不是 lambda 不应显示“0”,因为返回值将为 None。
  • 使用def有什么问题?当def 更清晰时,为什么还要使用lambda
  • @Akbaribrahim as None 不会被打印试试这个:clear = lambda: os.system('cls') or None
【解决方案3】:

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

【讨论】:

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

编辑:我刚刚阅读了“windows”,这是针对 linux 用户的,抱歉。


在 bash 中:

#!/bin/bash

while [ "0" == "0" ]; 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()。

【讨论】:

    【解决方案5】:

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

    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')
    【解决方案6】:

    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()
    【解决方案7】:

    虽然这是一个较老的问题,但我想我会贡献一些东西来总结我认为最好的其他答案,并建议您将这些命令放入文件中并添加我自己的皱纹将您的 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
    【解决方案8】:

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

    【讨论】:

      【解决方案9】:

      这里有两种不错的方法:

      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'
      • 看起来不错,是不是意味着程序可以跨平台了?
      【解决方案10】:

      这个要清楚吗

      - os.system('cls')
      

      这是尽可能短的!

      【讨论】:

      • 是的,但不是多平台的并且您必须在每次想要清除屏幕时重新输入。
      • What about Linux? It throws "cls command not found"
      【解决方案11】:

      我在 Windows XP SP3 上使用 MINGW/BASH。

      (将其粘贴在 .pythonstartup 中)
      # 我的 ctrl-l 已经有点用了,但这可能对其他人有帮助
      # 虽然在窗口底部留下提示...
      导入读取线
      readline.parse_and_bind('\C-l: clear-screen')

      # 这在 BASH 中有效,因为我在 .inputrc 中也有它,但是对于一些
      # 当我进入 Python 时它被丢弃的原因
      readline.parse_and_bind('\C-y: 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
      

      【讨论】:

        【解决方案12】:

        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='');可以帮助避免前面的新行。
        • 魔术字符串在我的 Python 3.6 的 Microsoft Windows 10 控制台上运行。我为字符串序列而不是 with open 的使用加分。
        【解决方案13】:
        >>> ' '*80*25
        

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

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

        【讨论】:

        • 该规则是为了避免简单地发布代码。它试图让人们解释他的答案,而不仅仅是给出代码。
        • 这不是一个好的答案——它只是打印一个 80*25 空格的字符串......这仅适用于控制台为 2000 个字符或更小(例如 80x25 或 100x20...但是控制台在我的机器上经常以 120x50 的分辨率结束。
        • 使用pypi.python.org/pypi/pagergetwidth/getheight 检测控制台参数。
        【解决方案14】:

        这是合并所有其他答案the definitive solution。特点:

        1. 您可以将代码复制粘贴到您的 shell 或脚本中。
        2. 您可以随意使用它:

          >>> clear()
          >>> -clear
          >>> clear  # <- but this will only work on a shell
          
        3. 您可以将其作为模块导入

          >>> from clear import clear
          >>> -clear
          
        4. 您可以将其作为脚本调用

          $ python clear.py
          
        5. 它是真正的多平台;如果它无法识别您的系统
          centdosposix)它将退回到打印空白行。


        您可以在此处下载 [完整] 文件: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()
        

        【讨论】:

          【解决方案15】:

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

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

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

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

          clear()
          

          就是这样。 PS:您可以随意命名您的功能。我见过人们使用“wiper”“wipe”及其变体。

          【讨论】:

            【解决方案16】:

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

            【讨论】:

              【解决方案17】:

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

              【讨论】:

                【解决方案18】:

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

                【讨论】:

                  【解决方案19】:

                  就用这个吧..

                  print '\n'*1000

                  【讨论】:

                  • OK, but this might crash the computer. Also, it places the cursor at the bottom of the screen.
                  【解决方案20】:

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

                  %清除

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

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

                  【讨论】:

                    【解决方案21】:

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

                    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。
                    【解决方案22】:

                    我不确定 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 相比。
                    【解决方案23】:

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

                    【讨论】:

                      【解决方案24】:

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

                      这与终端上的 OS X 相同。

                      【讨论】:

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

                      我使用iTerm 和 Mac OS 的本机终端应用程序。

                      我只需按 ⌘ + k

                      【讨论】:

                        【解决方案26】:

                        您可以通过多种方式在 Windows 上进行操作:

                        1。使用键盘快捷键:

                        Press CTRL + L
                        

                        2。使用系统调用方法:

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

                        3。使用换行打印 100 次:

                        cls = lambda: print('\n'*100)
                        cls()
                        

                        【讨论】:

                        • 所有这些方式都很漂亮...... naff。 cls 只能在 Windows 上工作,让你的程序很难跨平台,打印 100 newlines 只是...... eww?并且程序中没有使用键盘快捷键。
                        【解决方案27】:

                        我可能会迟到,但这里有一个非常简单的方法

                        类型:

                        def cls():
                            os.system("cls")
                        

                        所以你想清除屏幕的内容只需输入你的代码

                        cls()
                        

                        最好的方法! (信用:https://www.youtube.com/watch?annotation_id=annotation_3770292585&feature=iv&src_vid=bguKhMnvmb8&v=LtGEp9c6Z-U

                        【讨论】:

                          【解决方案28】:

                          只要输入

                          import os
                          os.system('cls') # Windows
                          os.system('clear') # Linux, Unix, Mac OS X
                          

                          【讨论】:

                            【解决方案29】:

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

                            print("\033[H\033[J", end="")
                            

                            更新:

                            由于这个答案引起了一些关注,您可能想知道它是如何工作的。上面的命令打印ANSI escape codes:

                            • \033 代表ESC(ANSI 值 27)。

                            • \033[ 是一个特殊的escape sequence,称为Control Sequence Introducer (CSI)。

                            • \033[H 命令将光标移动到屏幕的左上角。

                            • \033[J从光标处清屏到末尾 屏幕。

                            可选参数end=""在执行这些命令后避免打印换行符,所以&gt;&gt;&gt;停留在最上面一行。

                            【讨论】:

                            • 这样的好处是它也适用于 Spyder。
                            • 请问这是什么?
                            • 哦,我不清楚。我的意思是print("\033[H\033[J") 这个方法是怎么工作的,它叫什么名字!?
                            • 这确实是最好的解决方案。简单且多平台。
                            • 这是唯一真正解决问题的方法
                            【解决方案30】:

                            这是一个跨平台(Windows / Linux / Mac / 可能您可以在 if 检查中添加的其他平台)版本 sn-p 我结合了在这个问题中找到的信息:

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

                            【讨论】:

                              猜你喜欢
                              • 2021-12-10
                              • 2011-02-28
                              相关资源
                              最近更新 更多