我有一个python程序,它使用套接字通过网络发送消息,套接字使用两个线程,一个用于运行服务器,另一个用于运行客户端。 但是,如果在用户部分输入输入时接收到消息,则在输入的两半之间打印接收的消息。 虽然这在功能上没有区别,但在美学上看起来很糟糕。有没有什么办法可以让消息像用户开始输入之前一样输出?
如果我的解释不清楚,假设用户输入了" hel"在收到消息(" Sup")之前,然后" lo"之后,会显示:
HelPartner Sent: Sup
lo
任何建议都非常受欢迎。
答案 0 :(得分:0)
我认为你只需readline
即可。
当然,这意味着它在Windows上无法提供帮助。或者,如果您使用sys.stdin
做了任何时髦的事情,或者您直接从stdin
阅读,而不是使用input
这样的功能,或者您还没有一个TTY,或者你在IDLE之类的环境下运行,以自己的方式挂钩input
等等。但假设这些都不是一个交易破坏者,readline.get_line_buffer()
可能就是你想要的
如果您希望将输出排队直到用户完成输入 - 基本上与shell相同,例如,作业控制消息 - 如下所示:
import readline
output_buffer = []
output_buffer_lock = threading.Lock()
# Wherever you would normally print the output
if readline.get_line_buffer():
with output_buffer_lock:
output_buffer.append(output)
else:
with output_buffer_lock:
print('\n'.join(output_buffer + [output]))
output_buffer = []
# Wherever you're reading the input
line = input()
with output_buffer_lock:
print('\n'.join(output_buffer + [output]))
output_buffer = []
如果您想要中断用户的输入,请记住他们输入的内容,显示输出并重新启动输入,这有点复杂。输出线程需要一些方法来存储当前输入缓冲区(readline.get_line_buffer
),中断输入线程,清除当前输入(打印'\r' then a row of spaces and another '\r' should do it in simple cases, but see below), print the output, start a new
输入call, and refill the buffer (
readline.insert_text {{1} } readline.redisplay then possibly
输入; note that you have to call this after
set_pre_input_hook`来执行此操作。)
如果输入发生在主线程上,signal
处理程序(只会引发自定义异常)是中断starts but before it returns, so you probably want to use
调用的好方法。如果没有,那就太麻烦了。
同时,input
支持多行输入,默认情况下,如果用户输入的字符数超过80(或readline
),则会将内容包装到多行。在这种情况下,实际上没有办法从Python的$COLS
模块提供的高级API中删除整个输入。除非你想用readline
或自定义扩展模块编写或找到更低级别的包装器,否则我无法解决这个问题。