【问题标题】:Python3 prompt user input for a limited time, then enter a default if user doesn't respondPython3在有限的时间内提示用户输入,如果用户没有响应则输入默认值
【发布时间】:2018-04-01 01:15:49
【问题描述】:

Python3:我试图让用户在给定的时间内将响应输入到输入中,但是在给定的时间之后,如果他们没有输入任何内容,我想中止输入并分配一个存储输入的变量的默认值,或者在给定时间段后将默认值输入到输入语句中。

我试过这个:

from threading import Timer
timeout = 2
t = Timer(timeout, print, ["\nSorry, time is up"])
t.start()
answer = input("You have 2 seconds to answer:")
t.cancel()
print(answer)

来自不同的堆栈溢出帖子,但问题是即使在执行了最后一行并打印了answer 之后,解释器仍会提示用户输入,这不适用于我想要的做(本质上,一个命令行游戏需要在玩家没有输入时继续运行,但在收到输入时更新)。

最好的方法是什么?我知道python并没有真正的超时功能或类似的东西,但是有没有办法通过系统命令或模块来实现呢?

【问题讨论】:

    标签: python python-3.x input timeout


    【解决方案1】:

    有几种可行的方法(其中一些可能是 Unix 特有的):

    1. 读取subprocess 中的输入,在超时后可以killed。 (包括subprocess.run 在内的许多函数都接受timeout 参数来自动执行此操作。)
    2. 使用alarm 或类似方法向您自己的进程发送信号(并安装一个引发异常的signal 处理程序)。
    3. 有另一个线程close超时后正在读取的描述符;这听起来很激烈,但通常据说可以工作,只要您在使用 dup2 恢复之前不意外 open 关闭描述符上的文件。
    4. 使用非阻塞readselect 等较低级别的设施读取输入——不幸的是,这将禁用readline 之类的好东西。

    无论如何,您必须决定如何处理在超时之前输入的不完整但非空的输入。默认情况下,终端驱动程序可能会不可见地将其转移到下一个输入提示符。

    【讨论】:

    • 我目前正在 Windows 上进行开发,但正在尝试将代码设计为跨平台到 OS X。您将如何实施您建议的 subprocess 方法?
    • @AndrewMistele:我编辑了一个指向文档的简单指针。
    【解决方案2】:

    使用select 调用可能是一种更简单的方法。

    import sys, select
    
    print "You have ten seconds to answer!"
    
    i, o, e = select.select( [sys.stdin], [], [], 10 )
    
    if (i):
      print "You said", sys.stdin.readline().strip()
    else:
      print "You said nothing!"
    

    参考Keyboard input with timeout?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-19
      • 2014-04-18
      • 1970-01-01
      相关资源
      最近更新 更多