我有一个基于Python的应用程序,可以在一个简单的read-eval-print循环中接受一些命令.我正在使用raw_input('> ')
输入.在基于Unix的系统上,我还要import readline
让事情变得更好.这一切都很好.
问题是有异步事件进入,我想尽快打印输出.不幸的是,这让事情看起来很难看.输出后,">"字符串不再显示,如果用户输入内容的一半,则会将文本切成两半.它可能应该在打印后重绘用户正在进行的文本.
这似乎必须是一个已解决的问题.这样做的正确方法是什么?
另请注意,我的一些用户是基于Windows的.
TIA
编辑:接受的答案在Unixy平台下工作(当readline模块可用时),但如果有人知道如何在Windows下工作,那将非常感谢!
也许这样的事情会起到作用:
#!/usr/bin/env python2.6 from __future__ import print_function import readline import threading PROMPT = '> ' def interrupt(): print() # Don't want to end up on the same line the user is typing on. print('Interrupting cow -- moo!') print(PROMPT, readline.get_line_buffer(), sep='', end='') def cli(): while True: cli = str(raw_input(PROMPT)) if __name__ == '__main__': threading.Thread(target=cli).start() threading.Timer(2, interrupt).start()
我不认为stdin是线程安全的,所以你最终可能会丢失字符到中断线程(用户将不得不在结束时重新键入interrupt
).我夸大interrupt
了time.sleep
电话的时间.该readline.get_line_buffer
电话将不会显示迷失的人物,所以这一切原来好了.
请注意,stdout本身不是线程安全的,所以如果你有多个执行中断线程,那么这仍然看起来很糟糕.
你为什么用自己的REPL编写raw_input()
?你看过cmd.Cmd
课吗? 编辑:我刚刚找到了sclapp库,它也可能很有用.
注意:cmd.Cmd
类(和sclapp)可能会也可能不会直接支持您的原始目标; 您可能必须将其子类化并根据需要进行修改以提供该功能.