【问题标题】:Programmatically interrupting raw_input以编程方式中断 raw_input
【发布时间】:2010-07-02 17:49:11
【问题描述】:

有没有办法以编程方式中断 Python 的 raw_input?具体来说,我想向用户显示一个提示,但还要监听套接字描述符(例如使用 select)并中断提示,输出一些内容,如果数据进入套接字,则重新显示提示。

使用 raw_input 而不是简单地在 sys.stdin 上执行 select 的原因是我想使用 readline 模块为提示符提供行编辑功能。

【问题讨论】:

    标签: python input readline


    【解决方案1】:

    据我所知......“有点”。

    raw_input 是阻塞的,所以我能想到的唯一方法是生成一个子进程/线程来检索输入,然后简单地与线程/子进程通信。这是一个非常肮脏的黑客(至少在我看来是这样),但它应该可以跨平台工作。当然,另一种选择是在 linux 上使用 curses 模块,或者在 windows 上使用 this one

    【讨论】:

    • 我现在面临同样的问题。我想到了第一个解决方案(在另一个线程中调用 raw_input() ),但是在搜索后我发现仍然无法中断它,因为即使在从另一个线程中的一个线程(stackoverflow.com/questions/323972/…)引发异常之后它也不会t 死,当它忙于系统调用时(并且 raw_input() 归类为一个,不是吗?)... :(
    • 我面临着完全相同的问题。您将如何为 raw_input 使用单独的线程来解决这个问题?它仍然会阻塞。
    • @Tobias 因此,“有点”。进行更多实验,这似乎只是一个坏主意,即你只是重新实现诅咒。如果您使用的是多处理或 Popen,您应该能够向其他进程/线程发出信号,但这对于您通过另一种方法免费获得的东西来说只是很多开销。
    • 感谢您的回答。我有点惊讶这是一个如此困难的问题。经过多次尝试,我通过覆盖提示并在打印 OUTPUT 后重新打印内容解决了我的问题: current_buffer = readline.get_line_buffer() // print(term.clear_eol+term.move_x(0)+OUTPUT) // print('> ' +current_buffer, end='')
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-13
    • 2013-10-17
    • 1970-01-01
    • 2012-01-04
    相关资源
    最近更新 更多