在 Python 中等待非阻塞用户输入时显示提示
Show prompt when waiting for non-blocking user input in Python
我使用 select
从 sys.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.
我使用 select
从 sys.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.