Pythonスクリプトから端末の画面を消去するための標準的な「電池付き」方法はありますか。
エスケープシーケンスはどうですか?
print(chr(27) + "[2J")
シンプルでクロスプラットフォームの解決策は、Windowsではcls
コマンド、Unixシステムではclear
を使用することです。 os.system
と共に使用すると、これはNice one-linerになります。
import os
os.system('cls' if os.name == 'nt' else 'clear')
単に誰かが単にすることについて話していないのはなぜですか Ctrl+L Windowsの場合 Cmd+L Macでは。確かに画面をクリアするための最も簡単な方法。
Linux/UNIXシステムを使用している場合は、画面を消去するためにANSIエスケープシーケンスを印刷しても問題ありません。また、カーソルを画面の一番上に移動します。これはANSIをサポートするどの端末でも動作します。
import sys
sys.stderr.write("\x1b[2J\x1b[H")
ANSIサポートが有効になっていない限り、これはWindowsでは機能しません。 Windowsと同等の制御シーケンスがあるかもしれませんが、私は知りません。
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=""
が後で改行を表示しないようにすると指摘しました。
私にとっては、最もエレガントな変種です。
import os
os.system('cls||clear')
あなたは明確に頼ることを試みることができますが、それはすべてのLinuxディストリビューションで利用可能ではないかもしれません。あなたが言及したようにWindowsではclsを使用してください。
import subprocess
import platform
def clear():
subprocess.Popen( "cls" if platform.system() == "Windows" else "clear", Shell=True)
clear()
注:端末画面を制御するのは悪い形式と考えられます。あなたはオプションの使用を検討していますか?ユーザーが画面をクリアするかどうかをユーザーに決定させたほうがよいでしょう。
純粋なPythonソリューション。
ANSIまたは外部コマンドのどちらにも依存しません。
表示されている行数を端末に通知する機能が必要です。
from shutil import get_terminal_size
print("\n" * get_terminal_size().lines, end='')
Pythonバージョン> = 3.3.0
しばらく前にこれに遭遇しました
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()を使ってください
だから私はここに私の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()を使用してこれを実装する方法を誰かが知っている場合は、私もサブプロセスを使用することを好むがコメントしてください。
これは両方のバージョンで動作するでしょうPython2 OR Python3
print (u"{}[2J{}[;H".format(chr(27), chr(27)))
ただ使用してください:
print("\033c")
これにより端末ウィンドウがクリアされます。
この関数は、デフォルトでは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
で開始することもできます。
Pythonシェルを使用しているときに端末をクリアしたい場合。その後、次のようにして画面を消去します。
import os
os.system('clear')
call()
関数を使用して、端末のコマンドを実行できます。
from subprocess import call
call("clear")
Terminfoデータベースを分割することもできますが、そのための関数はとにかくcurses
にあります。
python -c "from os import system; system('clear')"
あなたはあなた自身のものを作ることができます。これはあなたの端末やOSの種類には依存しません。
def clear(num):
for i in range(num): print
clear(80)
print "hello"
これで25の新しい行がクリアされます。
def clear():
print(' \n' * 25)
clear()
私はpydevでEclipseを使います。改行の解決策は範囲内の数値に対してよりも優れています。 forループは警告を投げますが、print newlineは投げません。 clearステートメントで改行の数を指定したい場合は、このバリエーションを試してください。
def clear(j):
print(' \n' * j)
clear(25)
受け入れられた答え は良い解決策です。それに関する問題は、これまでのところそれが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の画面をクリア これも役に立つかもしれません。
画面をクリアするだけでよいのなら、おそらくこれで十分です。問題は、100%クロスプラットフォームの方法でLinuxのバージョンを超えてこれを行うことすらできないということです。問題は、端末の実装がすべてわずかに異なることをサポートしていることです。私は「クリア」が至るところでうまくいくと確信しています。しかし、もっと "完全な"答えはxterm制御文字を使ってカーソルを動かすことですが、それにはxtermそれ自体が必要です。
あなたの問題についてもっと知らなくても、あなたの解決策は十分に良いようです。
Windowsでは、インタプリタのコマンドラインでのみ(GUIではなく)!単に入力してください:(pythonでは適切な字下げを使うことを忘れないでください):
import os
def clear():
os.system('cls')
シェル(コマンドライン)でclear()
と入力するたびに、シェルの画面がクリアされます。シェルを終了した場合は、新しいPython(コマンドライン)シェルを開いたときに上記をやり直す必要があります。
注:使用しているPythonのバージョンは関係ありません(2.5、2.7、3.3、および3.4)。
画面をクリアするためのおそらく安っぽい方法ですが、私が知っているどのプラットフォームでもうまくいく方法は次のとおりです。
for i in xrange(0,100):
print ""
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)