如何设置 raw_input 的时间限制
在Python中,有没有一种方法可以在等待用户输入时计算时间,以便在30秒后自动跳过raw_input()
函数?
in python, is there a way to, while waiting for a user input, count time so that after, say 30 seconds, the raw_input()
function is automatically skipped?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
@jer 推荐的 signal.alarm 函数解决方案是基于的,不幸的是仅限 Unix。如果您需要跨平台或特定于 Windows 的解决方案,可以基于 threading.Timer 相反,使用 thread.interrupt_main 从计时器线程向主线程发送一个
KeyboardInterrupt
。即:无论 30 秒超时还是用户明确决定按 control-C 放弃输入任何内容,这都会返回 None,但以相同的方式处理这两种情况似乎可以(如果您需要区分,您可以可以为计时器使用您自己的函数,在中断主线程之前,在某处记录发生超时的事实,并在您的
KeyboardInterrupt
处理程序中访问该事实“某处”来区分这两种情况中哪一种发生)。编辑:我可以发誓这是有效的,但我一定是错的——上面的代码省略了明显需要的
timer.start()
、和< /em> 即使有了它,我也无法让它再工作了。select.select
显然是可以尝试的其他方法,但它不适用于 Windows 中的“普通文件”(包括 stdin)——在 Unix 中它适用于所有文件,而在 Windows 中则仅适用在插座上。所以我不知道如何进行跨平台“带超时的原始输入”。可以通过紧密循环轮询 msvcrt 构建特定于 Windows 的一个。 kbhit,执行
msvcrt.getche
(并检查它是否是一个返回来指示输出已完成,在这种情况下它会跳出循环,否则会累积并继续等待)并检查如果需要的话可以超时。我无法测试,因为我没有 Windows 机器(它们都是 Mac 和 Linux 机器),但这里我建议使用未经测试的代码:评论中的 OP 说他不想
超时时返回 None
,但是还有什么选择呢?引发异常?返回不同的默认值?无论他想要什么替代方案,他都可以清楚地用它代替我的return None
;-)。如果您不想仅仅因为用户输入缓慢而超时(而不是根本不输入!-),您可以在每次成功输入字符后重新计算 finishat。
The signal.alarm function, on which @jer's recommended solution is based, is unfortunately Unix-only. If you need a cross-platform or Windows-specific solution, you can base it on threading.Timer instead, using thread.interrupt_main to send a
KeyboardInterrupt
to the main thread from the timer thread. I.e.:this will return None whether the 30 seconds time out or the user explicitly decides to hit control-C to give up on inputting anything, but it seems OK to treat the two cases in the same way (if you need to distinguish, you could use for the timer a function of your own that, before interrupting the main thread, records somewhere the fact that a timeout has happened, and in your handler for
KeyboardInterrupt
access that "somewhere" to discriminate which of the two cases occurred).Edit: I could have sworn this was working but I must have been wrong -- the code above omits the obviously-needed
timer.start()
, and even with it I can't make it work any more.select.select
would be the obvious other thing to try but it won't work on a "normal file" (including stdin) in Windows -- in Unix it works on all files, in Windows, only on sockets.So I don't know how to do a cross-platform "raw input with timeout". A windows-specific one can be constructed with a tight loop polling msvcrt.kbhit, performing a
msvcrt.getche
(and checking if it's a return to indicate the output's done, in which case it breaks out of the loop, otherwise accumulates and keeps waiting) and checking the time to time out if needed. I cannot test because I have no Windows machine (they're all Macs and Linux ones), but here the untested code I would suggest:The OP in a comment says he does not want to
return None
upon timeout, but what's the alternative? Raising an exception? Returning a different default value? Whatever alternative he wants he can clearly put it in place of myreturn None
;-).If you don't want to time out just because the user is typing slowly (as opposed to, not typing at all!-), you could recompute finishat after every successful character input.
我在博客文章中找到了此问题的解决方案。以下是该博客文章中的代码:
请注意:此代码仅适用于 *nix 操作系统。
I found a solution to this problem in a blog post. Here's the code from that blog post:
Please note: this code will only work on *nix OSs.
input() 函数旨在等待用户输入某些内容(至少是 [Enter] 键)。
如果您不打算使用 input(),下面是使用 tkinter 的更轻松的解决方案。在 tkinter 中,对话框(以及任何小部件)可以在给定时间后被销毁。
这是一个例子:
The input() function is designed to wait for the user to enter something (at least the [Enter] key).
If you are not dead set to use input(), below is a much lighter solution using tkinter. In tkinter, dialog boxes (and any widget) can be destroyed after a given time.
Here is an example :
因为它是自定义的...在命令行提示符下运行它,我希望你能得到答案
阅读这个 python doc 你会非常清楚这里发生了什么代码!!
As it is self defined... run it in command line prompt , I hope you will get the answer
read this python doc you will be crystal clear what just happened in this code!!
一个用于定时数学测试的诅咒示例
A curses example which takes for a timed math test
在linux下可以使用curses和getch函数,它是非阻塞的。
请参阅 getch()
https://docs.python.org/2/library/curses。 html
函数等待键盘输入 x 秒(你必须首先初始化一个curses窗口(win1)!
under linux one could use curses and getch function, its non blocking.
see getch()
https://docs.python.org/2/library/curses.html
function that waits for keyboard input for x seconds (you have to initialize a curses window (win1) first!
这是针对较新的 python 版本的,但我相信它仍然会回答这个问题。它的作用是向用户创建一条消息,表明时间已到,然后结束代码。我确信有一种方法可以让它跳过输入而不是完全结束代码,但无论哪种方式,这至少应该有帮助......
This is for newer python versions, but I believe it will still answer the question. What this does is it creates a message to the user that the time is up, then ends the code. I'm sure there's a way to make it skip the input rather than completely end the code, but either way, this should at least help...