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

Show prompt when waiting for non-blocking user input in Python

我使用 selectsys.stdin 进行了非阻塞读取,它交替处理我的套接字和用户输入:

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()

获取和处理用户输入。

我想显示一个提示,为我的用户提供类似终端的视图;就像在阻塞标准输入中使用 input('> ') 时我们可以实现的那样。

但是,如果我在我的 process_user_input() 中使用 input('> ')> 将在用户输入他的命令后打印(正如预期的那样!)

some_command
> Invalid command. 

我该怎么做?

注意:由于我的代码中发生了其他事件,stdout 中可能会有一些打印(因此,print('> ', end='') 将失败)。所以我希望我的 > 在我等待输入时出现,即使在终端中进行了一些打印之后也是如此。

当您将输出写入终端时,它通常不会出现在终端上立即。相反,它在某个地方的缓冲区中等待,在某个适当的时间 "flushed" 到终端显示。在大多数系统上,该时间是您的代码写入换行符的时间。

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

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

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

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

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

  • 使用高级终端工具包,例如 Python Prompt Toolkit or Curses,始终将 '> ' 提示符显示在终端 window.