【问题标题】:Show prompt when waiting for non-blocking user input in Python在 Python 中等待非阻塞用户输入时显示提示
【发布时间】:2019-06-04 06:04:22
【问题描述】:

我使用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='') 将失败)。所以我希望我的> 在我等待输入时出现,即使在终端打印了一些之后也是如此。

【问题讨论】:

    标签: python python-3.x select stdin


    【解决方案1】:

    当您将输出写入终端时,它通常不会立即出现在终端上。相反,它在某处的缓冲区中等待,以便在某个合适的时间“刷新”到终端显示器。在大多数系统上,这段时间是您的代码编写换行符的时候。

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

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

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

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

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

    • 使用Python Prompt ToolkitCurses 等高级终端工具包,始终将'> ' 提示符保留在终端窗口底部。

    【讨论】:

    • 很抱歉我的回复太晚了。实际上,我按时阅读了您的回复并使用了您的第一个解决方案。但是你提出的其他解决方案对我来说很有趣,我希望我以后能用它们弄脏我的手。谢谢。
    猜你喜欢
    • 2016-09-18
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2011-05-23
    • 2015-01-15
    • 2017-01-01
    • 1970-01-01
    • 2015-03-08
    相关资源
    最近更新 更多