web-dev-qa-db-ja.com

Pythonの端末をクリア

Pythonスクリプトから端末の画面を消去するための標準的な「電池付き」方法はありますか。

166
Stefano Borini

エスケープシーケンスはどうですか?

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

シンプルでクロスプラットフォームの解決策は、Windowsではclsコマンド、Unixシステムではclearを使用することです。 os.system と共に使用すると、これはNice one-linerになります。

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

単に誰かが単にすることについて話していないのはなぜですか Ctrl+L Windowsの場合 Cmd+L Macでは。確かに画面をクリアするための最も簡単な方法。

68
sarath joseph

Linux/UNIXシステムを使用している場合は、画面を消去するためにANSIエスケープシーケンスを印刷しても問題ありません。また、カーソルを画面の一番上に移動します。これはANSIをサポートするどの端末でも動作します。

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

ANSIサポートが有効になっていない限り、これはWindowsでは機能しません。 Windowsと同等の制御シーケンスがあるかもしれませんが、私は知りません。

35
Dave Kirby

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

jamesnotjimはMac用にprint("\033c", end="")をテストしました、そして私はLinuxとWindows上でそれをテストしました(それはWindows用には動作しません、それ故clsを呼び出す他のコード)。私が最初に使ったのはprint( "\ 033c")やprintfバージョンのsubprocess.Popen("printf '\033c'", Shell=True).communicate()です。

rolikaは、end=""が後で改行を表示しないようにすると指摘しました。

28
Shule

私にとっては、最もエレガントな変種です。

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

あなたは明確に頼ることを試みることができますが、それはすべてのLinuxディストリビューションで利用可能ではないかもしれません。あなたが言及したようにWindowsではclsを使用してください。

import subprocess
import platform

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

clear()

注:端末画面を制御するのは悪い形式と考えられます。あなたはオプションの使用を検討していますか?ユーザーが画面をクリアするかどうかをユーザーに決定させたほうがよいでしょう。

8
Rod

純粋なPythonソリューション。
ANSIまたは外部コマンドのどちらにも依存しません。
表示されている行数を端末に通知する機能が必要です。

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

Pythonバージョン> = 3.3.0

7
mid_kid

しばらく前にこれに遭遇しました

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)

それならちょうどclearscreen()を使ってください

5
Short

だから私はここに私の2セントを投げるだろうと思った...

OPの質問に対する正しい答えは誰にも提供されていません。誰もが 'NO DONT USE 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()を使用してこれを実装する方法を誰かが知っている場合は、私もサブプロセスを使用することを好むがコメントしてください。

4
StarKiller4011

これは両方のバージョンで動作するでしょうPython2 OR Python3

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

ただ使用してください:

print("\033c")

これにより端末ウィンドウがクリアされます。

3
Alex Hawking

この関数は、デフォルトではANSIエスケープシーケンスを認識するため、gnome-terminalで機能します。それはあなたにCLEAN Prompt 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 = ('\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))

実装:

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は、Promptとterminalの一番下の間に追加するクリアテキスト行の数で、すべてを押し上げます。 rows_maxは、テキスト行での端末の高さ(または最大消去高さ)であり、一度だけ設定する必要がありますが、いつでもリセットできます。 3番目のパラメータ位置にある*,は、後続のすべてのパラメータがキーワードのみであることを意味します(たとえば、clear(absolute = 5))。 calling_line=True(デフォルト)は対話モードでよりよく機能します。 calling_line=Falseは、テキストベースの端末アプリケーションに適しています。対話モードで端末のサイズを縮小した後でグリッチのあるギャップの問題を解決しようとするためにabsoluteが追加されましたが、端末アプリケーションにも使用できます。 store_maxは、rows_max値の秘密の「永続的な」記憶域です。このパラメータを明示的に使用しないでください。 (store_maxに引数が渡されない場合、store_maxのリストの内容を変更すると、このパラメーターのデフォルト値が変更されます。したがって、永続記憶域になります。)

移植性:すみません、これはIDLEでは動作しませんが、ANSIエスケープシーケンスを認識する端末(コンソール)で対話モードで>> VERY COOL <<を動作させます。私はgnome-terminalでPython 3.3を使ってUbuntu 13.10でこれをテストしました。ですから、移植性はPython 3.3(最良の結果を得るためのshutil.get_terminal_size()関数)とANSI認識にのみ依存していると考えることができます。 print(...)関数はPython 3です。私はこれを単純なテキストベースの端末Tic Tac Toeゲーム(アプリケーション)でもテストしました。

インタラクティブモードで使用する場合最初にインタラクティブモードでcopy(...)関数をコピーして貼り付け、それがあなたのために機能するかどうかを確認してください。もしそうであれば、上記の関数をclear.pyという名前のファイルに入れてください。ターミナルで 'python3'を使ってpythonを起動します。入る:

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

ここでclear.pyファイルをリストされているpathディレクトリの1つにドロップして、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

端末アプリケーションで使用する場合copy(...)関数を、main。pyファイルと同じフォルダーにあるclear.pyという名前のファイルに入れます。これは、Tic Tac Toeゲームアプリケーション(端末Promptから実行:python3tictactoe。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()

説明:19行目のdo_print(...)は、いくつの新しい行が印刷されたかを追跡するために必要なprint(...)のバージョンです(self.rows)。それ以外の場合は、プログラム全体でprint(...)が呼び出される場所全体でself.rows += 1を実行する必要があります。そのため、show_board()を呼び出してボードが再描画されるたびに、前のボードは消去され、新しいボードは本来あるべき場所に正確に印刷されます。 9行目のself.clear(calling_line=False)は基本的にRELATIVEを端末の一番下まで押し上げますが、元の呼び出し元の行を消去するわけではありません。これとは対照的に、29行目のself.clear(absolute=self.rows)は、端末の底面を基準にしてすべてを押し上げるのではなく、すべてのself.rowsの距離を上方向にすべてクリアします。

Python 3.3を使っているUbuntuユーザ:tictactoe.pyファイルの最初の行に#!/usr/bin/env python3を置いてください。 tictactoe.pyファイルを右クリックし、[プロパティ]、[権限]タブ、[実行の確認]の順にクリックします。プログラムとしての実行を許可します。ファイルをダブルクリック=> [ターミナルで実行]ボタンをクリックします。開いている端末の現在のディレクトリがtictactoe.pyファイルの現在のディレクトリである場合は、ファイルを./tictactoe.pyで開始することもできます。

3
JD Graham

Pythonシェルを使用しているときに端末をクリアしたい場合。その後、次のようにして画面を消去します。

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

call()関数を使用して、端末のコマンドを実行できます。

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

Terminfoデータベースを分割することもできますが、そのための関数はとにかくcursesにあります。

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

1
Dyno Fu

あなたはあなた自身のものを作ることができます。これはあなたの端末やOSの種類には依存しません。

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

clear(80)
print "hello"
1
ghostdog74

これで25の新しい行がクリアされます。

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

clear()

私はpydevでEclipseを使います。改行の解決策は範囲内の数値に対してよりも優れています。 forループは警告を投げますが、print newlineは投げません。 clearステートメントで改行の数を指定したい場合は、このバリエーションを試してください。

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

clear(25)
1
B-Rell

受け入れられた答え は良い解決策です。それに関する問題は、これまでのところそれが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シーケンス(出力ではgobbledygookとして表示されます)を削除し、それらを適切な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 answerは、Windows上では非常に安全ではありません。はい、動作しますが、本当にハックです。スクリプトと同じ辞書にあるcls.batまたはcls.exeという名前のファイルは、コマンドと競合してコマンドの代わりにファイルを実行するため、大きなセキュリティ上の危険があります。

リスクを最小限に抑えるための1つの方法は、clsコマンドが呼び出される場所を変更することです。

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

これにより、Cの妄想語Dの辞書がC:\Windowに変更されます。 (ここでバックスラッシュが重要です)それから実行してください。 C:\Windowsは常に存在し、そこに書き込むための管理権限を必要とします。そのため、このコマンドを最小限のリスクで実行するのに適しています。もう1つの解決策は、そのような脆弱性に対して保護されているため、コマンドプロンプトではなくPowerShellを介してコマンドを実行することです。

この質問で言及されている他の方法もあります: Shellの画面をクリア これも役に立つかもしれません。

0
Simon

画面をクリアするだけでよいのなら、おそらくこれで十分です。問題は、100%クロスプラットフォームの方法でLinuxのバージョンを超えてこれを行うことすらできないということです。問題は、端末の実装がすべてわずかに異なることをサポートしていることです。私は「クリア」が至るところでうまくいくと確信しています。しかし、もっと "完全な"答えはxterm制御文字を使ってカーソルを動かすことですが、それにはxtermそれ自体が必要です。

あなたの問題についてもっと知らなくても、あなたの解決策は十分に良いようです。

0
Falmarri

Windowsでは、インタプリタのコマンドラインでのみ(GUIではなく)!単に入力してください:(pythonでは適切な字下げを使うことを忘れないでください):

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

シェル(コマンドライン)でclear()と入力するたびに、シェルの画面がクリアされます。シェルを終了した場合は、新しいPython(コマンドライン)シェルを開いたときに上記をやり直す必要があります。

注:使用しているPythonのバージョンは関係ありません(2.5、2.7、3.3、および3.4​​)。

0
Riyad El-Laithy

画面をクリアするためのおそらく安っぽい方法ですが、私が知っているどのプラットフォームでもうまくいく方法は次のとおりです。

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

Windowsでは、次のものを使用できます。

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

これを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を渡すと、画面をクリアして正常に終了するので、きれいな画面でシェルを使用し続けることができます。

>>> clear(0)
0
DarkXDroid