等待Python中的非阻塞用户输入时显示提示

时间:2019-06-04 06:04:22

标签: python python-3.x select stdin

我使用sys.stdinselect进行了非阻塞读取,它为我的套接字和用户输入替换了处理程序:

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='')将失败)。所以我希望>可以在我等待输入的任何时候出现,即使终端上有一些打印之后。

1 个答案:

答案 0 :(得分:0)

将输出写入终端时,通常不会立即显示在终端上。取而代之的是,它在某个地方的缓冲区中等待,以便在某个适当的时候“刷新”到终端显示。在大多数系统上,那是您的代码编写换行符的时间。

由于您希望'> '提示符与用户输入出现在同一行上,因此您不能在其后写换行符来刷新缓冲区。相反,必须将flush参数添加到print函数调用中:

print(end='> ', flush=True)

如果希望在屏幕上打印其他输出后出现提示,则可以:

  • 在程序等待用户输入时,在产生输出的其他任何代码的末尾添加print(end='> ', flush=True)

  • 创建自己的Python标准输出流sys.stdout的实现,每当程序的其他部分打印换行符时,都会添加print(end='> ', flush=True)

  • 使用诸如Python Prompt ToolkitCurses之类的高级终端工具包,始终将'> '提示符保持在终端窗口的底部。