Python - 更优雅地清除终端屏幕

Jos*_* A. 2 python shell terminal

我知道你可以通过执行clearusing来清除 shell os.system,但这种方式对我来说似乎很混乱,因为命令被记录在历史记录中并且被字面解释为作为用户运行到操作系统的命令。

我想知道是否有更好的方法来清除命令行脚本中的输出?

jfs*_*jfs 5

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

在我的系统上工作。

您还可以缓存由clear命令生成的清屏转义序列:

import subprocess
clear_screen_seq = subprocess.check_output('clear')
Run Code Online (Sandbox Code Playgroud)

然后

print clear_screen_seq
Run Code Online (Sandbox Code Playgroud)

任何时候你想清屏。

tput clear产生相同序列的命令在 POSIX 中定义。

您可以使用curses, 来获取序列:

import curses
import sys

clear_screen_seq = b''
if sys.stdout.isatty():
    curses.setupterm()
    clear_screen_seq = curses.tigetstr('clear')
Run Code Online (Sandbox Code Playgroud)

优点是您不需要调用curses.initscr()它来获取具有.erase(),.clear()方法的窗口对象。

要在 Python 2 和 3 上使用相同的源代码,您可以使用os.write()函数:

import os
os.write(sys.stdout.fileno(), clear_screen_seq)
Run Code Online (Sandbox Code Playgroud)

clear我系统上的命令也尝试使用tigetstr("E3").

这是clear.c命令的完整 Python 端口:

#!/usr/bin/env python
"""Clear screen in the terminal."""
import curses
import os
import sys

curses.setupterm()
e3 = curses.tigetstr('E3') or b''
clear_screen_seq = curses.tigetstr('clear') or b''
os.write(sys.stdout.fileno(), e3 + clear_screen_seq)
Run Code Online (Sandbox Code Playgroud)