我使用sys.stdin
从select
进行了非阻塞读取,它为我的套接字和用户输入替换了处理程序:
while True:
input_ready, _, _ = select.select([my_socket, sys.stdin], [], [])
for sender in input_ready:
if sender == sys.stdin:
process_user_input()
elif sender == my_socket:
process_socket_reply()
在process_user_input()
中,我有:
command = input()
获取并处理用户输入。
我想显示一个提示,向用户提供类似终端的视图;就像在阻塞的stdin输入中使用input('> ')
一样,我们可以实现。
但是,如果我在input('> ')
中使用process_user_input()
,则会在用户输入命令后打印>
(如预期!)
some_command
> Invalid command.
我该怎么做?
注意:由于我的代码中发生了另一个事件,因此stdout中可能有一些打印内容(因此print('> ', end='')
将失败)。所以我希望>
可以在我等待输入的任何时候出现,即使终端上有一些打印之后。
答案 0 :(得分:0)
将输出写入终端时,通常不会立即显示在终端上。取而代之的是,它在某个地方的缓冲区中等待,以便在某个适当的时候“刷新”到终端显示。在大多数系统上,那是您的代码编写换行符的时间。
由于您希望'> '
提示符与用户输入出现在同一行上,因此您不能在其后写换行符来刷新缓冲区。相反,必须将flush
参数添加到print
函数调用中:
print(end='> ', flush=True)
如果希望在屏幕上打印其他输出后出现提示,则可以:
在程序等待用户输入时,在产生输出的其他任何代码的末尾添加print(end='> ', flush=True)
。
创建自己的Python标准输出流sys.stdout
的实现,每当程序的其他部分打印换行符时,都会添加print(end='> ', flush=True)
。
使用诸如Python Prompt Toolkit或Curses之类的高级终端工具包,始终将'> '
提示符保持在终端窗口的底部。