首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何实现一个能够很好地处理异步输出的python REPL?

如何实现一个能够很好地处理异步输出的python REPL?
EN

Stack Overflow用户
提问于 2009-01-12 21:11:44
回答 6查看 7.1K关注 0票数 13

我有一个基于Python的应用程序,它可以在一个简单的read-eval-print-loop循环中接受一些命令。我使用raw_input('> ')来获取输入。在基于Unix的系统上,我也使用import readline来让事情变得更好一些。所有这些都运行得很好。

问题是有异步事件进入,我希望一旦发生就打印输出。不幸的是,这让事情看起来很丑陋。">“字符串在输出后不会再次出现,如果用户输入了一半,它就会将文本切成两半。在打印某些内容之后,它可能会重新绘制用户的正在处理的文本。

这似乎是一个必须解决的问题。这样做的正确方法是什么?

还要注意的是,我的一些用户是基于Windows的。

提亚

编辑:被接受的答案在Unixy平台下工作(当readline模块可用时),但如果有人知道如何在Windows下工作,将不胜感激!

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2009-01-12 21:33:20

也许像这样的东西就能解决这个问题:

代码语言:javascript
复制
#!/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本身不是线程安全的,所以如果您有多个中断线程的执行,这仍然可能最终看起来很糟糕。

票数 8
EN

Stack Overflow用户

发布于 2009-01-13 21:44:41

为什么你要用raw_input()编写你自己的REPL?你看过cmd.Cmd类吗?编辑:我刚刚找到了sclapp库,它可能也很有用。

注意:cmd.Cmd类(和sclapp)可能直接支持您的原始目标,也可能不直接支持;您可能需要将其子类化并根据需要对其进行修改以提供该特性。

票数 5
EN

Stack Overflow用户

发布于 2010-12-22 18:57:43

运行以下命令:

代码语言:javascript
复制
python -m twisted.conch.stdio

在不使用线程的情况下,你会得到一个漂亮的,彩色的,异步的REPL,。当您键入提示符时,事件循环正在运行。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/437025

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档