webentwicklung-frage-antwort-db.com.de

Terminal in Python löschen

Gibt es eine Standardmethode "kommt mit Batterien", um den Bildschirm des Terminals von einem Python-Skript zu löschen, oder muss ich Flüche ausführen (die Bibliotheken, nicht die Wörter)?

164
Stefano Borini

Was ist mit Escape-Sequenzen?

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

Eine einfache und plattformübergreifende Lösung wäre die Verwendung des Befehls cls unter Windows oder clear auf Unix-Systemen. In Verbindung mit os.system ist dies ein schöner Einzeiler:

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

Warum hat niemand darüber gesprochen, einfach nur zu tun? Ctrl+L in Windows oder Cmd+L in Mac. Sicherlich die einfachste Art, den Bildschirm zu löschen.

68
sarath joseph

Wenn Sie sich auf einem Linux/UNIX-System befinden, sollten Sie die ANSI-Escape-Sequenz ausdrucken, um den Bildschirm zu löschen. Sie möchten auch den Cursor an den oberen Rand des Bildschirms bewegen. Dies funktioniert auf jedem Terminal, das ANSI unterstützt.

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

Dies funktioniert unter Windows nur, wenn die ANSI-Unterstützung aktiviert wurde. Es gibt möglicherweise eine entsprechende Kontrollsequenz für Windows, aber ich weiß es nicht.

35
Dave Kirby

Für Windows, Mac und Linux können Sie den folgenden Code verwenden:

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="")

jamesnotjim hat print("\033c", end="") für Mac getestet, und ich habe es unter Linux und Windows getestet (es funktioniert nicht für Windows, daher der andere Code, der cls aufruft). Ich kann mich nicht erinnern, wer ich zum ersten Mal gesehen habe, use print ("\ 033c") und/oder die printf-Version: subprocess.Popen("printf '\033c'", Shell=True).communicate().

rolika wies darauf hin, dass end="" verhindern wird, dass danach eine neue Zeile gedruckt wird.

27
Shule

Für mich die eleganteste Variante:

import os
os.system('cls||clear')
22
Vasiliy Rusin

Sie könnten versuchen, sich auf clear zu verlassen, aber es ist möglicherweise nicht auf allen Linux-Distributionen verfügbar. Verwenden Sie unter Windows cls, wie Sie es erwähnt haben.

import subprocess
import platform

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

clear()

Hinweis: Die Kontrolle über den Bildschirm des Terminals kann als schlechte Form betrachtet werden. Erwägen Sie die Verwendung einer Option? Es ist wahrscheinlich besser, den Benutzer entscheiden zu lassen, ob er den Bildschirm löschen möchte.

8
Rod

Eine reine Python-Lösung.
Verlässt sich weder auf ANSI- noch auf externe Befehle.
Nur Ihr Terminal muss in der Lage sein, Ihnen mitzuteilen, wie viele Zeilen angezeigt werden.

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

Python-Version> = 3.3.0

7
mid_kid

Kam vor einiger Zeit hierher

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)

Dann benutze einfach den Clearscreen ().

5
Short

Ich dachte nur, ich würde meine zwei Cents hier reinwerfen ...

Niemand hat eine echte Antwort auf die OP-Frage gegeben, es scheint, jeder antwortet mit "NO DONT USE os.system (), es ist böse !!!" ohne Erklärung oder bietet eine Lösung, die auf dem Drucken neuer Zeilen beruht.

Für diejenigen, die den Bildschirm des Terminals löschen und aus irgendeinem Grund zurückblättern müssen, können Sie den folgenden Code verwenden:

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

Dies hat die gewünschte Wirkung des OP. Es verwendet den Befehl os.system (). Wenn das also böse ist und jemand eine Möglichkeit kennt, dies mit subprocess.call () zu implementieren, kommentieren Sie dies bitte, da ich auch subprocess vorziehen würde, aber ich bin überhaupt nicht vertraut.

4
StarKiller4011

Wenn Sie Ihr Terminal löschen möchten, wenn Sie eine Python-Shell verwenden. Anschließend können Sie den Bildschirm wie folgt löschen

import os
os.system('clear')
3
Aditya Mishra

Dies funktioniert in Beide Version Python2 OR Python3

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

Sie können die Funktion call() verwenden, um die Befehle des Terminals auszuführen:

from subprocess import call
call("clear")
2
Arash Hatami

Diese Funktion funktioniert in gnome-terminal, da sie standardmäßig ANSI-Escape-Sequenzen erkennt. Es gibt Ihnen einen CLEAN Prompt rows_max Abstand von der Unterseite des Terminals, aber auch genau von dem Ort, an dem es aufgerufen wurde. Gibt Ihnen die vollständige Kontrolle darüber, wie viel Sie löschen müssen.

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 = ('\033[1A' + ' ' * 30 if calling_line else '') + linesep * rows
    else:
        s = '\033[{}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 + '\033[{}A'.format(rows + 1))

Implementierung:

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

Parameter: rows ist die Anzahl der Klartextzeilen, die zwischen Eingabeaufforderung und dem unteren Ende des Terminals hinzugefügt werden müssen. rows_max ist die Höhe des Terminals (oder die maximale Löschhöhe) in Textzeilen und muss nur einmal festgelegt werden. Sie kann jedoch jederzeit zurückgesetzt werden. *, an der dritten Parameterposition bedeutet, dass alle folgenden Parameter nur ein Schlüsselwort sind (z. B. clear (absolut = 5)). calling_line=True (Standardeinstellung) funktioniert im interaktiven Modus besser. calling_line=False funktioniert besser für textbasierte Terminalanwendungen. absolute wurde hinzugefügt, um zu versuchen, Glitchy Gap-Probleme im Interactive-Modus zu beheben, nachdem die Größe des Terminals reduziert wurde. Es kann jedoch auch für Terminalanwendungen verwendet werden. store_max dient nur zur geheimen, "dauerhaften" Speicherung des rows_max-Werts; Verwenden Sie diesen Parameter nicht explizit. (Wenn für store_max kein Argument übergeben wird, ändert das Ändern des Listeninhalts von store_max den Standardwert dieses Parameters. Daher permanenter Speicher.)

Portabilität: Sorry, dies funktioniert nicht bei IDLE, aber es funktioniert im interaktiven Modus in einem Terminal (Konsole), das ANSI-Escape-Sequenzen erkennt. Ich habe dies nur in Ubuntu 13.10 mit Python 3.3 im Gnome-Terminal getestet. Daher kann ich nur davon ausgehen, dass die Portabilität von Python 3.3 (für die Funktion shutil.get_terminal_size() für BEST-Ergebnisse) und der ANSI-Erkennung abhängt. Die Funktion print(...) ist Python 3. Ich habe dies auch mit einem einfachen, textbasierten Terminal Tic Tac Toe (Anwendung) getestet.

Für die Verwendung im interaktiven Modus: Kopieren Sie zunächst die Funktion copy(...) im interaktiven Modus und fügen Sie sie ein. Wenn ja, dann legen Sie die obige Funktion in eine Datei namens clear.py. Starten Sie im Terminal Python mit 'python3'. Eingeben:

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

Legen Sie die clear.py-Datei jetzt in einem der path-Verzeichnisse ab, damit Python es finden kann (überschreiben Sie keine vorhandenen Dateien). Von jetzt an einfach zu benutzen:

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

Für die Verwendung in einer Terminalanwendung: Legen Sie die Funktion copy(...) in eine Datei namens clear.py ab, die sich im selben Ordner wie Ihre main .py-Datei befindet. Hier ist ein funktionierendes abstraktes (Skelett) Beispiel aus einer Tic Tac Toe-Spielanwendung (wird vom Terminal Prompt ausgeführt: 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 __== "__main__":
    TicTacToe().start()

Erläuterung: do_print(...) in Zeile 19 ist eine Version von print(...), die benötigt wird, um nachzuverfolgen, wie viele neue Zeilen gedruckt wurden (self.rows). Andernfalls müssten Sie self.rows += 1 überall, wo print(...) im gesamten Programm aufgerufen wird. Jedes Mal, wenn die Karte durch Aufruf von show_board() neu gezeichnet wird, wird die vorherige Karte gelöscht und die neue Karte genau dort gedruckt, wo sie sein sollte. Hinweis self.clear(calling_line=False) in Zeile 9 drückt im Wesentlichen alles nach RELATIVE an den unteren Rand des Terminals, löscht jedoch nicht die ursprüngliche aufrufende Zeile. Im Gegensatz dazu löscht self.clear(absolute=self.rows) in Zeile 29 absolut alles self.rows nach oben, anstatt alles relativ zum unteren Ende des Terminals nach oben zu drücken.

Ubuntu-Benutzer mit Python 3.3: Setzen Sie #!/usr/bin/env python3 in die erste Zeile der Datei tictactoe.py. Klicken Sie mit der rechten Maustaste auf die Datei tictactoe.py => Eigenschaften => Registerkarte "Berechtigungen" => Aktivieren Sie Ausführen: Ausführen der Datei als Programm zulassen. Doppelklicken Sie auf die Datei => Klicken Sie auf die Schaltfläche In Terminal ausführen. Wenn das aktuelle Verzeichnis eines geöffneten Terminals das der Datei tictactoe.py ist, können Sie die Datei auch mit ./tictactoe.py starten.

2
JD Graham

Sie könnten sich durch die terminfo-Datenbank reißen, die entsprechenden Funktionen finden Sie jedoch in curses.

Die akzeptierte Antwort ist eine gute Lösung. Das Problem dabei ist, dass es bisher nur unter Windows 10, Linux und Mac funktioniert. Ja Windows (bekannt dafür fehlende ANSI-Unterstützung)! Diese neue Funktion wurde unter Windows 10 (und höher) implementiert, die ANSI-Unterstützung beinhaltet, obwohl Sie sie aktivieren müssen. Dadurch wird der Bildschirm plattformübergreifend gelöscht:

import os

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

Unter Windows 10 wird jedoch Folgendes ausgegeben:

[2J

Dies ist auf die fehlende ANSI-Unterstützung in früheren Windows-Builds zurückzuführen. Dies kann jedoch mit dem Modul colorama gelöst werden. Dies fügt Unterstützung für ANSI-Zeichen unter Windows hinzu:

ANSI-Escape-Zeichenfolgen wurden lange verwendet, um auf Unix und Macs farbigen Terminaltext und Cursorposition zu erzeugen. Colorama macht dies auch unter Windows möglich, indem er stdout umgibt, die gefundenen ANSI-Sequenzen (die in der Ausgabe als gobbledygook erscheinen würden) entfernt und diese in die entsprechenden win32-Aufrufe konvertiert, um den Status des Terminals zu ändern. Auf anderen Plattformen macht Colorama nichts.

Hier ist also eine plattformübergreifende Methode:

import sys

if sys.platform == 'win32':
    from colorama import init
    init()

print('Hello World')

print("\x1B[2J")

Oder print(chr(27) + "[2J") anstelle von print("\x1B[2J") verwendet.


Die Antwort von @poke ist unter Windows sehr unsicher, ja, es funktioniert, aber es ist wirklich ein Hack. Eine Datei mit dem Namen cls.bat oder cls.exe im selben Wörterbuch wie das Skript führt zu einem Konflikt mit dem Befehl und führt die Datei anstelle des Befehls aus, wodurch ein großes Sicherheitsrisiko entsteht.

Eine Methode zur Minimierung des Risikos könnte darin bestehen, den Ort zu ändern, an dem der Befehl cls aufgerufen wird:

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

Dadurch wird das C urrant D ictionary in C:\Window (hier ist ein Backslash wichtig) geändert und anschließend ausgeführt. C:\Windows ist immer anwesend und benötigt Administratorberechtigungen, um dort zu schreiben, was die Ausführung dieses Befehls mit minimalem Risiko ermöglicht. Eine andere Lösung besteht darin, den Befehl über PowerShell anstelle der Eingabeaufforderung auszuführen, da er vor solchen Sicherheitsanfälligkeiten geschützt ist. 

Es gibt auch andere Methoden, die in dieser Frage erwähnt werden: Clear screen in Shell die ebenfalls nützlich sein können.

1
Simon

Benutz einfach:

print("\033c")

Dadurch wird das Terminalfenster gelöscht.

1
Alex Hawking

python -c "from os import system; system('clear')"

1
Dyno Fu

sie können Ihre eigenen machen. Dies hängt nicht von Ihrem Terminal oder dem Betriebssystem ab.

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

clear(80)
print "hello"
1
ghostdog74

Dadurch werden 25 neue Zeilen gelöscht:

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

clear()

Ich benutze Eclipse mit pydev. Ich mag die Newline-Lösung besser als die für num in range . Die for - Schleife gibt Warnungen aus, während die Druckzeilenzeile nicht ..__ ist. Wenn Sie die Anzahl der Linienzeilen in der Anweisung clear angeben möchten, versuchen Sie diese Variation.

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

clear(25)
1
B-Rell

Wenn Sie nur den Bildschirm löschen müssen, ist dies wahrscheinlich gut genug. Das Problem ist, dass es nicht einmal 100% plattformübergreifend ist, dies bei allen Linux-Versionen zu tun. Das Problem ist, dass die Implementierungen des Terminals alle etwas andere Dinge unterstützen. Ich bin mir ziemlich sicher, dass "clear" überall funktioniert. Die "vollständigere" Antwort ist jedoch die Verwendung der Xterm-Steuerzeichen, um den Cursor zu bewegen, dies erfordert jedoch Xterm an und für sich.

Ohne mehr über Ihr Problem zu wissen, scheint Ihre Lösung gut genug zu sein.

0
Falmarri

Für Windows nur in der Interpreter-Befehlszeile (nicht in der GUI)! Geben Sie einfach Folgendes ein: (Denken Sie daran, die richtige Einrückung mit Python zu verwenden): 

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

Jedes Mal, wenn Sie clear() in der Shell (Befehlszeile) eingeben, wird der Bildschirm in der Shell gelöscht. Wenn Sie die Shell beenden, müssen Sie das Obige wiederholen, um es erneut zu tun, wenn Sie eine neue Python-Shell (Befehlszeile) öffnen.

Hinweis: Unabhängig von der verwendeten Python-Version ist dies explizit (2.5, 2.7, 3.3 & 3.4).

0
Riyad El-Laithy

Ein vielleicht kitschiger Weg, um den Bildschirm zu löschen, aber auf jeder Plattform, die ich kenne, funktioniert Folgendes:

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

In Windows können Sie verwenden:

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

Ich würde es auf diese Weise tun, damit es eher wie bash aussieht:

Erstellen Sie einfach eine Datei mit dem Namen .pythonstartup im Basisverzeichnis und verwenden Sie die Antwort von poke in einer Funktion

Unter Linux:

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

Sie können export PYTHONSTARTUP=$HOME/.pythonstartup zu Ihrer ./bashrc-Datei hinzufügen

Denn was mich interessiert, ist Platz. Beim Aufruf der Funktion wird die Beschreibung des Python-Interpreters beim Start nicht angezeigt. Sie können jedoch clear() entfernen, um sie beizubehalten.

Die Verwendung einer normalen Funktion sollte den Trick ausführen, ohne den Beendigungsstatus zu drucken:

>>> clear()

Wenn Sie der Funktion das Argument 0 übergeben, wird der Bildschirm gelöscht und erfolgreich beendet, sodass Sie die Shell weiterhin in einem sauberen Bildschirm verwenden können

>>> clear(0)
0
DarkXDroid