当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何实现一个很好地处理异步输出的pythonREPL?》经验,为你挑选了2个好方法。

我有一个基于Python的应用程序,可以在一个简单的read-eval-print循环中接受一些命令.我正在使用raw_input('> ')输入.在基于Unix的系统上,我还要import readline让事情变得更好.这一切都很好.

问题是有异步事件进入,我想尽快打印输出.不幸的是,这让事情看起来很难看.输出后,">"字符串不再显示,如果用户输入内容的一半,则会将文本切成两半.它可能应该在打印后重绘用户正在进行的文本.

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

另请注意,我的一些用户是基于Windows的.

TIA

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



1> cdleary..:

也许这样的事情会起到作用:

#!/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).我夸大interrupttime.sleep电话的时间.该readline.get_line_buffer电话将不会显示迷失的人物,所以这一切原来好了.

请注意,stdout本身不是线程安全的,所以如果你有多个执行中断线程,那么这仍然看起来很糟糕.



2> Teddy..:

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

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


斯克拉普似乎已经不复存在了.提供的链接不起作用,我没有找到它的新家.
推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有