【发布时间】:2011-10-26 19:31:39
【问题描述】:
我有一个 python 脚本,它可以管理任何应用程序的标准输入、标准输出和标准错误,并允许优雅地插入 readline。想想任何具有大量控制台输出但也接受来自标准输入的命令的应用程序。
无论如何,我的脚本使用了这两个函数:
def blank_current_readline():
# Next line said to be reasonably portable for various Unixes
(rows,cols) = struct.unpack('hh', fcntl.ioctl(sys.stdout, termios.TIOCGWINSZ,'1234'))
text_len = len(readline.get_line_buffer())+2
# ANSI escape sequences (All VT100 except ESC[0G)
sys.stdout.write('\x1b[2K') # Clear current line
sys.stdout.write('\x1b[1A\x1b[2K'*(text_len/cols)) # Move cursor up and clear line
sys.stdout.write('\x1b[0G') # Move to start of line
def print_line(line):
global cmd_state
blank_current_readline()
print line,
sys.stdout.write(cmd_state["prompt"] + readline.get_line_buffer())
sys.stdout.flush()
在处理标准输出时,我调用 print_line()。这会清空用户可能正在输入的任何内容,打印该行,然后恢复用户的输入文本。这一切都是在用户没有注意到的情况下发生的。
问题发生在光标不在用户输入的任何输入的末尾时。当光标在测试中间并打印一行时,光标将自动置于输入的末尾。为了解决这个问题,我想在 print_line 中做这样的事情:
def print_line(line):
global cmd_state
cursorPos = getCurrentCursorPos() #Doesn't exist
blank_current_readline()
print line,
sys.stdout.write(cmd_state["prompt"] + readline.get_line_buffer())
sys.stdout.setCurrentCursorPos(cursorPos) #Doesn't exist
sys.stdout.flush()
编辑:尝试可视化我所写的内容:
终端是这样的:
----------------------------------------------
| |
| |
| <scolling command output here> |
| |
| <scolling command output here> |
| |
|: <user inputted text here> |
----------------------------------------------
因此,随着新日志的出现,输出文本会不断滚动。同时,用户当前正在编辑和编写一个新命令,该命令将在按 Enter 时插入。所以它看起来像 python 控制台,但总是附加输出。
【问题讨论】: