在用户按下回车之前跟踪当前输入
Keeping track of current input before user presses enter
我正在使用 Python 的 cmd
模块来处理终端输入循环。
我在后台有一个线程 运行,当它收到一条消息时,它会在终端打印一些东西。这些消息破坏了视觉用户输入:
> writing a com
@@@ message generated from a thread and printing during user input @@@
mand
我问了一个相关问题 并且基本上被告知避免破坏用户输入的一种方法是跟踪用户输入,这样当收到消息时我可以打印消息并重印用户输入。当我问这个问题时,我没有使用 cmd
模块。
使用 cmd
模块时,我如何跟踪用户当前输入的内容,以便我可以在之后重新打印?
我发现了 readline
module 并且它是 get_line_buffer()
方法。
这是我解决它的方法,在我在主线程中读取用户输入时想要打印数据的线程中:
import readline
# Save the current buffer
current_buffer = readline.get_line_buffer()
# Print our stuff, note the \r is important to overwrite the current buffer
print("\rladida interruption\nsome more interruption\n")
# Reprint our buffer
print('> ' + current_buffer, end='', flush=True)
这是一个例子,之前:
$ ./main.py
> help
及之后:
$ ./main.py
ladida interruption
some more interruption
> help
请注意命令提示符是如何干净利落地向下移动的,用户当前的命令输入就位。光标也位于正确的位置以继续输入,退格键也可以正常工作。
我正在使用 Python 的 cmd
模块来处理终端输入循环。
我在后台有一个线程 运行,当它收到一条消息时,它会在终端打印一些东西。这些消息破坏了视觉用户输入:
> writing a com
@@@ message generated from a thread and printing during user input @@@
mand
我问了一个相关问题 cmd
模块。
使用 cmd
模块时,我如何跟踪用户当前输入的内容,以便我可以在之后重新打印?
我发现了 readline
module 并且它是 get_line_buffer()
方法。
这是我解决它的方法,在我在主线程中读取用户输入时想要打印数据的线程中:
import readline
# Save the current buffer
current_buffer = readline.get_line_buffer()
# Print our stuff, note the \r is important to overwrite the current buffer
print("\rladida interruption\nsome more interruption\n")
# Reprint our buffer
print('> ' + current_buffer, end='', flush=True)
这是一个例子,之前:
$ ./main.py
> help
及之后:
$ ./main.py
ladida interruption
some more interruption
> help
请注意命令提示符是如何干净利落地向下移动的,用户当前的命令输入就位。光标也位于正确的位置以继续输入,退格键也可以正常工作。