清除 Python 中的终端[重复]

2024-12-09 08:31:00
admin
原创
87
摘要:问题描述:是否存在任何标准的“自带电池”方法来清除 Python 脚本中的终端屏幕,或者我必须去curses(库,而不是单词)?解决方案 1:一种简单的跨平台解决方案是cls在 Windows 或clearUnix 系统上使用命令。与 一起使用os.system,这会形成一个很好的单行代码:import os...

问题描述:

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


解决方案 1:

一种简单的跨平台解决方案是cls在 Windows 或clearUnix 系统上使用命令。与 一起使用os.system,这会形成一个很好的单行代码:

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

解决方案 2:

使用转义序列:

print(chr(27) + "[2J")

解决方案 3:

在 Windows 中 只需输入Ctrl+ ,在 Mac 中输入+ 。L`Cmd`L

这确实是清除屏幕最简单的方法。

解决方案 4:

对我来说,最优雅的变体是:

import os
os.system('cls||clear')

解决方案 5:

对于 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("c", end="")
    else:
        subprocess.run(["cls"])
else: #Linux and Mac
    print("c", end="")

jamesnotjimprint("c", end="")针对 Mac 进行了测试,而我在 Linux 和 Windows 上对其进行了测试(它不适用于 Windows,因此需要调用其他代码cls)。我不记得是谁第一次看到使用print("c")和/或 printf 版本:subprocess.run("printf 'c'", shell=True)

rolika 指出这end=""将阻止它随后打印新行。

clear请注意,与旧版本不同,较新版本的 Ubuntu 可以使用 清除屏幕(而不仅仅是向下滚动以使其看起来被清除) 。

请注意,使用 ESC c(“\033c”)重置终端将使光标加下划线并闪烁。如果您不想这样,可以使用以下代码将其更改为其他样式(在 GNOME Terminal 3.44.0 上使用 VTE 0.68.0 +BIDI +GNUTLS +ICU +SYSTEMD 进行了测试):

  • 下划线闪烁:“\033[0 q”

  • 块闪烁:“\033[1 q”

  • 块:“\033[2 q”

  • 下划线闪烁:“\033[3 q”

  • 下划线:“\033[4 q”

  • 细条闪烁:“\033[5 q”

  • 细条:“\033[6 q”(6 以上的数字似乎也是如此)

另请注意,您可以执行以下任何操作来清除 Linux 上的屏幕:

  • 打印(“\033c”,结束=“”):

  • 打印(“/u001bc”,结束=“”)

  • 打印(“\U0000001bc”,结束=“”)

  • 打印(“c”,结束=“”)

  • subprocess.run(["clear"]) #这不会重置整个终端

  • 子进程.运行('echo -ne“\033c”',shell = True)

  • 子进程.run('echo -ne“\ec”',shell = True)

  • 子进程.run('echo -ne“/u001bc”',shell = True)

  • 子进程.run('echo -ne“\U0000001bc”',shell = True)

  • 子进程.run('echo -ne“c”',shell = True)

  • 子进程.运行(“printf'\033c'”,shell=True)

  • 子进程.运行(“printf'\ec'”,shell=True)

  • 子进程.运行(“printf'/u001bc'”,shell=True)

  • 子进程.运行(“printf'\U0000001bc'”,shell=True)

  • 子进程.运行(“printf'c'”,shell=True)

我相信以下代码应该可以清除您必须向上滚动才能看到的内容(但很难与另一个命令结合使用而不会出现问题):

  • 打印(“\033[3J”)

这可以做与以前相同的事情clear(因此您可以向上滚动查看已删除的内容,只是它不会将光标提升到顶部):

  • 打印(“\033[2J”)

解决方案 6:

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

import sys
sys.stderr.write("x1b[2Jx1b[H")

除非启用了 ANSI 支持,否则这在 Windows 上不起作用。Windows 上可能有等效的控制序列,但我不知道。

解决方案 7:

只需使用:

print("c")

这将清除终端窗口。

解决方案 8:

这将在 Python2 或 Python3 版本中起作用

print (u"{}[2J{}[;H".format(chr(27), chr(27)))

解决方案 9:

您可以尝试使用 clear,但它可能并非在所有 Linux 发行版上都可用。在 Windows 上,请使用您提到的cls 。

import subprocess
import platform

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

clear()

注意:控制终端屏幕可能被认为是不好的做法。您是否考虑使用选项?让用户决定是否要清除屏幕可能更好。

解决方案 10:

我前段时间遇到过这个问题:

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('
' * numlines)

然后只需使用 clearscreen()。

解决方案 11:

似乎没有人对 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')

这达到了 OP 的预期效果。它确实使用了 os.system() 命令,也许可以使用 subprocess.call() 来实现。

解决方案 12:

Python 解决方案。

它不依赖于ANSI或外部命令。

只有您的终端才有能力告诉您有多少行可见。

from shutil import get_terminal_size
print("
" * get_terminal_size().lines, end='')

Python 版本 3.3.0 或更高版本。

解决方案 13:

该函数在GNOME终端中有效,因为它默认识别ANSI 转义序列。它不仅为您提供了与终端底部干净的提示 rows_max距离,还为您提供了与调用位置的精确距离。它让您完全控制要清除多少内容。

def clear(rows=-1, rows_max=None, *, calling_line=True, absolute=None,
          store_max=[]):
    """clear(rows=-1, rows_max=None)
clear(0, -1) # Restore auto-determining rows_max
clear(calling_line=False) # Don't clear calling line
clear(absolute=5) # Absolutely clear out to 5 rows up"""
    from os import linesep
    if rows_max and rows_max != -1:
        store_max[:] = [rows_max, False]
    elif not store_max or store_max[1] or rows_max == -1 or absolute:
        try:
            from shutil import get_terminal_size
            columns_max, rows_max = get_terminal_size()
        except ImportError:
            columns_max, rows_max = 80, 24
        if absolute is None:
            store_max[:] = [rows_max, True]
    if store_max:
        if rows == -1:
            rows = store_max[0]
        elif isinstance(rows, float):
            rows = round(store_max[0] * rows)
        if rows > store_max[0] - 2:
            rows = store_max[0] - 2
    if absolute is None:
        s = ('' + ' ' * 30 if calling_line else '') + linesep * rows
    else:
        s = '[{}A'.format(absolute + 2) + linesep
        if absolute > rows_max - 2:
            absolute = rows_max - 2
        s += (' ' * columns_max + linesep) * absolute + ' ' * columns_max
        rows = absolute
    print(s + '[{}A'.format(rows + 1))

执行:

clear() # Clear all, TRIES to automatically get terminal height
clear(800, 24) # Clear all, set 24 as terminal (max) height
clear(12) # Clear half of terminal below if 24 is its height
clear(1000) # Clear to terminal height - 2 (24 - 2)
clear(0.5) # float factor 0.0 - 1.0 of terminal height (0.5 * 24 = 12)
clear() # Clear to rows_max - 2 of user given rows_max (24 - 2)
clear(0, 14) # Clear line, reset rows_max to half of 24 (14-2)
clear(0) # Just clear the line
clear(0, -1) # Clear line, restore auto-determining rows_max
clear(calling_line=False) # Clear all, don't clear calling line
clear(absolute=5) # Absolutely clear out to 5 rows up

参数:rows是在提示符和终端底部之间添加的清晰文本行数,将所有内容向上推。rows_max是终端的高度(或最大间隙高度),以文本行表示,只需设置一次,但可以随时重置。*,在第三个参数位置意味着所有后续参数都只是关键字(例如,clear(absolute=5))。calling_line=True(默认)在交互模式下效果更好。calling_line=False更适合基于文本的终端应用程序。absolute在减小终端尺寸后,尝试修复交互模式下的故障间隙问题,但也可以用于终端应用程序。store_max仅用于秘密的“持久”rows_max值存储;不要明确使用此参数。(当没有传递参数时store_max,更改列表内容会store_max更改此参数的默认值。因此,持久存储。)

可移植性:抱歉,这在IDLE中不起作用,但在识别 ANSI 转义序列的终端(控制台)的交互模式下,它可以工作>>非常酷<<。我只在Ubuntu 13.10(Saucy Salamander)中使用 gnome-terminal 中的 Python 3.3 测试了这一点。所以我只能假设可移植性依赖于 Python 3.3(对于最佳shutil.get_terminal_size()结果的函数)和 ANSI 识别。该函数是 Python 3。我还用一个简单的、基于文本的终端井字游戏(应用程序)测试了这一点。print(...)

在交互模式下使用:首先在交互模式下复制并粘贴该copy(...)函数,看看它是否适合您。如果是这样,则将上述函数放入名为clear.py的文件中。在终端中,使用“python3”启动 Python 解释器。输入:

>>> import sys
>>> sys.path
['', '/usr/lib/python3.3', ...

现在将 clear.py 文件放入列出的目录之一path,以便 Python 可以找到它(不要覆盖任何现有文件)。从现在开始轻松使用:

>>> from clear import clear
>>> clear()
>>> print(clear.__doc__)
clear(rows=-1, rows_max=None)
clear(0, -1) # Restore auto-determining rows_max
clear(calling_line=False) # Don't clear calling line
clear(absolute=5) # Absolutely clear out to 5 rows up

在终端应用程序中使用:将函数放入名为 clear.py 的文件中,该文件与.py 文件copy(...)位于同一文件夹中。以下是井字游戏应用程序的一个工作抽象(骨架)示例(从终端提示符运行:python3 tictactoe .py):

from os import linesep

class TicTacToe:
    def __init__(self):
        # Clear screen, but not calling line
        try:
            from clear import clear
            self.clear = clear
            self.clear(calling_line=False)
        except ImportError:
            self.clear = False
        self.rows = 0    # Track printed lines to clear

        # ...
        self.moves = [' '] * 9

    def do_print(self, *text, end=linesep):
        text = list(text)
        for i, v in enumerate(text[:]):
            text[i] = str(v)
        text = ' '.join(text)
        print(text, end=end)
        self.rows += text.count(linesep) + 1

    def show_board(self):
        if self.clear and self.rows:
            self.clear(absolute=self.rows)
        self.rows = 0
        self.do_print('Tic Tac Toe')
        self.do_print('''   |   |
 {6} | {7} | {8}
   |   |
-----------
   |   |
 {3} | {4} | {5}
   |   |
-----------
   |   |
 {0} | {1} | {2}
   |   |'''.format(*self.moves))

    def start(self):
        self.show_board()
        ok = input("Press <Enter> to continue...")
        self.moves = ['O', 'X'] * 4 + ['O']
        self.show_board()
        ok = input("Press <Enter> to close.")

if __name__ == "__main__":
    TicTacToe().start()

解释:第 19 行是需要跟踪已打印的新行数( )do_print(...)的版本。否则,您将不得不在整个程序中到处调用 。因此,每次通过调用重新绘制板时,都会清除前一个板,并将新板打印到应在的位置。请注意,第 9 行基本上将所有东西相对于终端底部向上推,但不会清除原始调用行。相比之下,第 29 行绝对清除所有距离向上的东西,而不仅仅是将所有东西相对于终端底部向上推。print(...)`self.rowsself.rows += 1print(...)show_board()self.clear(calling_line=False)self.clear(absolute=self.rows)self.rows`

使用 Python 3.3 的 Ubuntu 用户:#!/usr/bin/env python3在 tictactoe.py 文件的第一行输入 。右键单击 tictactoe.py 文件 => 属性 => 权限选项卡 => 勾选执行:允许将文件作为程序执行。双击文件 => 点击在终端中运行按钮。如果打开的终端的当前目录是 tictactoe.py 文件的目录,您也可以使用 启动该文件./tictactoe.py

解决方案 14:

如果你在使用 Python shell 时想要清除终端,那么你可以执行以下操作来清除屏幕

import os
os.system('clear')

解决方案 15:

在 Windows 中,您可以使用:

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

解决方案 16:

您可以使用该call()函数执行终端的命令:

from subprocess import call

call("clear")

解决方案 17:

您可以彻底检查terminfo数据库,但是这样做的功能curses无论如何都是无效的。

解决方案 18:

接受的答案是一个很好的解决方案。问题是,到目前为止,它仅适用于 Windows 10、Linux 和 Mac。是的,Windows(以缺乏 ANSI 支持而闻名)!此新功能已在包含 ANSI 支持的 Windows 10(及更高版本)上实现,尽管您必须启用它。这将以跨平台方式清除屏幕:

import os

print ('Hello World')
os.system('') 
print ("x1B[2J")

然而,在 Windows 10 以下的任何系统中,它都会返回以下内容:

[2J

这是因为以前的 Windows 版本缺乏 ANSI 支持。不过,可以使用colorama模块解决这个问题。这增加了 Windows 上对 ANSI 字符的支持:

ANSI 转义字符序列长期以来一直用于在 Unix 和 Mac 上生成彩色终端文本和光标定位。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.batcls.exe同在同一个字典中的文件将与命令发生冲突,并执行文件而不是命令,从而造成巨大的安全隐患。

cls降低风险的一种方法是改变调用命令的位置:

import os
os.system('cd C:\\Windows|cls' if os.name == 'nt' else 'clear')

这会将C urrant字典更改为C:Window(此处反斜杠很重要),然后执行。 C:Windows始终存在,并且需要管理权限才能写入,因此执行此命令时风险最小。另一种解决方案是通过 PowerShell 而不是命令提示符运行命令,因为它已针对此类漏洞进行了保护。

这个问题中还提到了其他方法:在 shell 中清除屏幕也可能有用。

解决方案 19:

您可以自行制作。这将不依赖于您的终端或操作系统类型。

def clear(num):
    for i in range(num): print

clear(80)
print "hello"

解决方案 20:

如果您只需要清除屏幕,那么这可能就足够了。问题是,在 Linux 版本之间甚至没有 100% 跨平台的方法来实现这一点。问题是终端的实现都支持略有不同的东西。我相当肯定“清除”在任何地方都有效。但更“完整”的答案是使用xterm控制字符来移动光标,但这需要 xterm 本身。

在不进一步了解您的问题的情况下,您的解决方案似乎已经足够好了。

解决方案 21:

这将清除 25 条新行:

def clear():
    print(' 
' * 25)

clear()

我使用Eclipse和PyDev。我更喜欢换行符解决方案for num in range。for循环会抛出警告,而 print newline 不会。如果您想在 clear 语句中指定换行符的数量,请尝试此变体。

def clear(j):
    print(' 
' * j)

clear(25)

解决方案 22:

对于 Windows,仅在解释器命令行上(不是 GUI!)只需输入(记住使用 Python 的正确缩进):

import os
def clear():
    os.system('cls')

每次在 shell(命令行)中输入内容时clear(),它都会清除 shell 中的屏幕。如果退出 shell,则必须在打开新的 Python(命令行)shell 时重新执行上述操作。

注意:您使用的 Python 版本并不重要,明确地说(2.5、2.7、3.3 和 3.4)。

解决方案 23:

我会这样做,使它看起来更像Bash:

只需在主目录中创建一个名为 .pythonstartup 的文件,并在函数中使用poke 的答案。

在 Linux 上:

echo "from subprocess import call
def clear(int=None):
    call('clear')
    if int == 0:
       exit()
clear()" >> $HOME/.pythonstartup ; export PYTHONSTARTUP=$HOME/.pythonstartup ; python

您可以添加export PYTHONSTARTUP=$HOME/.pythonstartup到您的./bashrc文件中

因为我关心的是空间;对该函数的调用不会在启动时显示 python 解释器描述,但您可以删除clear()它以保留它。

像普通函数一样使用它就可以了,而无需打印退出状态:

>>> clear()

如果将参数 0 传递给函数,它将清除屏幕并成功退出,因此您可以在干净的屏幕上继续使用 shell:

>>> clear(0)

解决方案 24:

清除屏幕的方法可能比较俗气,但可以在我所知道的任何平台上使用,方法如下:

for i in xrange(0,100):
    print ""

解决方案 25:

默认情况下,os.system("clear")/os.system("cls")将返回 int 类型 0。我们可以通过将其分配给变量并删除该变量来彻底清除屏幕。

def clear():
    if (os.name == 'nt'):    
        c = os.system('cls')
    else:
        c = os.system('clear')
    del c  # can also omit c totally

#clear()

解决方案 26:

这适用于所有平台,并且在 Python 2 和 3 中都有效。

def clear(number):
    for i in range(number):
        print(" ")

然后要清除只需输入clear(numberhere)

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   984  
  在项目管理领域,CDCP(Certified Data Center Professional)认证评审是一个至关重要的环节,它不仅验证了项目团队的专业能力,还直接关系到项目的成功与否。在这一评审过程中,沟通技巧的运用至关重要。有效的沟通不仅能够确保信息的准确传递,还能增强团队协作,提升评审效率。本文将深入探讨CDCP...
华为IPD流程   0  
  IPD(Integrated Product Development,集成产品开发)是一种以客户需求为核心、跨部门协同的产品开发模式,旨在通过高效的资源整合和流程优化,提升产品开发的成功率和市场竞争力。在IPD培训课程中,掌握关键成功因素是确保团队能够有效实施这一模式的核心。以下将从五个关键成功因素展开讨论,帮助企业和...
IPD项目流程图   0  
  华为IPD(Integrated Product Development,集成产品开发)流程是华为公司在其全球化进程中逐步构建和完善的一套高效产品开发管理体系。这一流程不仅帮助华为在技术创新和产品交付上实现了质的飞跃,还为其在全球市场中赢得了显著的竞争优势。IPD的核心在于通过跨部门协作、阶段性评审和市场需求驱动,确保...
华为IPD   0  
  华为作为全球领先的通信技术解决方案提供商,其成功的背后离不开一套成熟的管理体系——集成产品开发(IPD)。IPD不仅是一种产品开发流程,更是一种系统化的管理思想,它通过跨职能团队的协作、阶段评审机制和市场需求驱动的开发模式,帮助华为在全球市场中脱颖而出。从最初的国内市场到如今的全球化布局,华为的IPD体系在多个领域展现...
IPD管理流程   0  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用