清除Python中的终端

Ste*_*ini 175 python terminal

是否存在任何标准的"自带电池"方法来清除Python脚本中的终端屏幕,还是我必须去诅咒(库,而不是单词)?

pok*_*oke 280

一个简单的跨平台解决方案是cls在Windows或clearUnix系统上使用该命令.与之配合使用os.system,这是一个不错的单线程:

import os
os.system('cls' if os.name == 'nt' else 'clear')
Run Code Online (Sandbox Code Playgroud)

  • @allyourcode我的答案中的代码*明确安全*来自注入,因为那里没有涉及用户输入.可以传递给`os.system`的所有​​字符串都是固定的. (36认同)
  • @jsbueno我现在无法告诉Unix,但Windows上的`cls`确实*不打印空行.它显式地清除了控制台缓冲区,因此它不等于打印任何数量的空格.此外,对于"明确错误"的内容,代码的效果非常好.你可能不喜欢它,但这并没有错(更不用说Windows上的`cls`不是一个进程而是控制台主机的功能,例如cmd.exe或PowerShell). (27认同)
  • 代码显然是错误的,因为当您需要打印一些换行符(这就是 `clear` 和 `cls` 所做的)时,您运行了整个过程: `print("\n" * 100) ` (3认同)

Jor*_*ril 106

逃脱序列怎么样?

print(chr(27) + "[2J")
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这在所有终端类型中都不可移植......不是说这些天你会遇到太多奇怪的类型...... (22认同)
  • 这种技术将光标向下移动.尝试Ctrl + L,效果不同.我认为脚本应该将光标位置重置到该行的顶部. (7认同)
  • 或者现在,在Python3中,打印(chr(27)+"[2J") (5认同)
  • print('\ x1b [2J') - 也适用于py3 (3认同)
  • 对不起,但我无法抗拒:https://imgs.xkcd.com/comics/real_programmers.png (3认同)
  • 打印(chr(27)+“c”)或打印(“\x1bc”) (2认同)

sar*_*eph 76

为什么没有任何人谈过只是简单地做Ctrl+ L在Windows或 Cmd+ L在Mac上.当然是清除屏幕最简单的方法.

  • @ParagGangil不是那些想要_programmatically_清除屏幕的人的最佳答案. (54认同)
  • 它不起作用.只需在命令中键入^ L(Windows 10中的Python控制台) (9认同)
  • 我在Ubuntu上,我正在使用`os.system('clear')`但我认为你的答案是最简单的方法.Upvoted!:) (3认同)
  • 到目前为止,这是最好的答案.你也知道如何向上滚动我的python控制台,因为当屏幕被填满时我必须写在最后一行,它不会向上滚动. (2认同)
  • 这个答案如何不在顶部,它是迄今为止最好的 (2认同)
  • 这在命令行上有效,您是否真的尝试过在Python中执行此操作? (2认同)
  • 我正在使用 Ubuntu,点击“ctrl+L”可以清理终端屏幕,但是我如何才能以编程方式完成此操作,正如问题作者所问的那样? (2认同)

Dav*_*rby 35

如果您使用的是Linux/UNIX系统,则打印ANSI转义序列以清除屏幕应该可以完成工作.您还需要将光标移动到屏幕顶部.这适用于任何支持ANSI的终端.

import sys
sys.stderr.write("\x1b[2J\x1b[H")
Run Code Online (Sandbox Code Playgroud)

除非已启用ANSI支持,否则这将无法在Windows上运行.Windows可能有一个等效的控制序列,但我不知道.

  • 既然你的回答暗示你正在使用Python 2.x,并且因为2.x`print`(没有`softspace`调优和/或`sys.stdout.flush()`)不能*永远*离开游标在屏幕的左上角,我编辑了你可以在Python 2.x和3.x中使用的答案 (3认同)
  • 你能解释一下为什么写到stderr而不是stdout,拜托? (3认同)
  • `进口colorama; colorama.init()`使``\ x1b [2J\x1b [H"`序列也适用于Windows. (3认同)
  • 对于任何想知道的人来说,该字符串是一系列[ANSI转义码](http://en.wikipedia.org/wiki/ANSI_escape_code).\ x1b [是一个控制序列导入器(十六进制0x1B).代码2J清除整个屏幕.代码H设置光标位置,没有参数默认为左上角. (2认同)
  • 我可以确认stderr缓存在我的*机器上运行Arch Linux,zsh和Python3内部的tmux(通过ssh) - 要求我运行`sys.stderr.flush()`.`print()`实际上也可以. (2认同)

Shu*_*ule 28

对于Windows,Mac和Linux,你可以使用下面的代码:

import subprocess, platform

if platform.system()=="Windows":
    subprocess.Popen("cls", shell=True).communicate() #I like to use this instead of subprocess.call since for multi-word commands you can just type it out, granted this is just cls and subprocess.call should work fine 
else: #Linux and Mac
    print("\033c", end="")
Run Code Online (Sandbox Code Playgroud)

jamesnotjim测试print("\033c", end="")了Mac,我在Linux和Windows上测试过它(它不适用于Windows,因此调用其他代码cls).我不记得是谁,这是我第一次看到用印刷物("\ 033C")和/或printf的版本:subprocess.Popen("printf '\033c'", shell=True).communicate().

rolika指出,以后end=""会阻止它打印新行.

  • 这也适用于我(使用print("\ 033c")),我认为这是最好的解决方案.在与os.system('clear')进行比较时无需导入os.它也清除没有回滚. (7认同)
  • `print("\ 033c",end ="")`如果不想打印换行符 (3认同)
  • 有人知道什么是\ 033c? (2认同)

Vas*_*sin 23

至于我,最优雅的变种:

import os
os.system('cls||clear')
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是一个非常有趣的解决方案 - 我没有意识到这是特别可能的...... (4认同)
  • @SirJames,真的很简单。Windows 接受“cls”并忽略其他知道的 Unix 运行函数,忽略“cls” (2认同)

Rod*_*Rod 8

您可以尝试依赖clear,但可能并非在所有Linux发行版上都可用.在Windows上使用你提到的cls.

import subprocess
import platform

def clear():
    subprocess.Popen( "cls" if platform.system() == "Windows" else "clear", shell=True)

clear()
Run Code Online (Sandbox Code Playgroud)

注意:控制终端屏幕可能被视为不良形式.你在考虑使用一个选项吗?让用户决定是否要清除屏幕可能会更好.

  • 我会使用`subprocess.call()`来做一些像这个调用一样简单的事情. (4认同)

Nan*_*mar 8

这将适用于 Python2 或 Python3 版本

print (u"{}[2J{}[;H".format(chr(27), chr(27)))
Run Code Online (Sandbox Code Playgroud)

  • `print (u"{}[2J{}[;H".format(chr(27), chr(27)), end="")` 用于删除换行符。 (2认同)

mid*_*kid 7

纯Python解决方案.
不依赖于ANSI或外部命令.
只有您的终端必须能够告诉您视线中有多少行.

from shutil import get_terminal_size
print("\n" * get_terminal_size().lines, end='')
Run Code Online (Sandbox Code Playgroud)

Python版本> = 3.3.0

  • 这不是将光标留在屏幕的底部吗? (2认同)

Sta*_*011 5

所以以为我会把我的两分钱丢在这里...

似乎没有人提供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')
Run Code Online (Sandbox Code Playgroud)

这具有OP的预期效果。它确实使用了os.system()命令,所以如果这很邪恶,并且有人知道使用subprocess.call()实现此方法的方法,请评论,因为我也更喜欢使用subprocess,但一点都不熟悉。

  • @Simon,您的参考不是按照OP要求的跨平台,而是针对达尔文设备。是的,“clear”在某些 nix 环境中工作,但不是在所有环境中工作,而“cls”是特定于 Windows 的,“echo -e \\\\033c”在所有 Bash 环境中工作 (2认同)

小智 5

前段时间遇到过这个问题

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)
Run Code Online (Sandbox Code Playgroud)

然后只使用clearscreen()


Ale*_*ing 5

只需使用:

print("\033c")
Run Code Online (Sandbox Code Playgroud)

这将清除终端窗口。

  • 另外,`print("\033c", end="")`在清除控制台时不会注入换行符。 (3认同)
  • 这与[this](/sf/answers/1615260671/)答案有何不同? (2认同)