我有一个基于Python的应用程序,它可以在一个简单的read-eval-print-loop循环中接受一些命令。我使用raw_input('> ')来获取输入。在基于Unix的系统上,我也使用import readline来让事情变得更好一些。所有这些都运行得很好。
问题是有异步事件进入,我希望一旦发生就打印输出。不幸的是,这让事情看起来很丑陋。">“字符串在输出后不会再次出现,如果用户输入了一半,它就会将文本切成两半。在打印某些内容之后,它可能会重新绘制用户的正在处理的文本。
这似乎是一个必须解决的问题。这样做的正确方法是什么?
还要注意的是,我的一些用户是基于Windows的。
提亚
编辑:被接受的答案在Unixy平台下工作(当readline模块可用时),但如果有人知道如何在Windows下工作,将不胜感激!
发布于 2009-01-12 21:33:20
也许像这样的东西就能解决这个问题:
#!/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()我不认为标准输入是线程安全的,所以你可能会把字符丢失给中断的线程(用户必须在interrupt的末尾重新输入)。我使用time.sleep调用夸大了interrupt时间。readline.get_line_buffer调用不会显示丢失的字符,因此一切正常。
请注意,stdout本身不是线程安全的,所以如果您有多个中断线程的执行,这仍然可能最终看起来很糟糕。
发布于 2009-01-13 21:44:41
为什么你要用raw_input()编写你自己的REPL?你看过cmd.Cmd类吗?编辑:我刚刚找到了sclapp库,它可能也很有用。
注意:cmd.Cmd类(和sclapp)可能直接支持您的原始目标,也可能不直接支持;您可能需要将其子类化并根据需要对其进行修改以提供该特性。
发布于 2010-12-22 18:57:43
运行以下命令:
python -m twisted.conch.stdio在不使用线程的情况下,你会得到一个漂亮的,彩色的,异步的REPL,。当您键入提示符时,事件循环正在运行。
https://stackoverflow.com/questions/437025
复制相似问题