我有一个无限的while循环,我希望在用户按下某个键时突破。通常我使用raw_input
来获取用户的回复;但是,我需要raw_input
不等待响应。我想要这样的东西:
print 'Press enter to continue.'
while True:
# Do stuff
#
# User pressed enter, break out of loop
这应该很简单,但我似乎无法弄明白。我倾向于使用线程的解决方案,但我宁愿不必这样做。我怎么能做到这一点?
答案 0 :(得分:8)
您可以使用stdin的非阻塞读取:
import sys
import os
import fcntl
import time
fl = fcntl.fcntl(sys.stdin.fileno(), fcntl.F_GETFL)
fcntl.fcntl(sys.stdin.fileno(), fcntl.F_SETFL, fl | os.O_NONBLOCK)
while True:
print("Waiting for user input")
try:
stdin = sys.stdin.read()
if "\n" in stdin or "\r" in stdin:
break
except IOError:
pass
time.sleep(1)
答案 1 :(得分:2)
我认为你可以用msvcrt做得更好:
import msvcrt, time
i = 0
while True:
i = i + 1
if msvcrt.kbhit():
if msvcrt.getwche() == '\r':
break
time.sleep(0.1)
print(i)
可悲的是,仍然是特定于Windows的。
答案 2 :(得分:2)
在python 3.5上,您可以使用以下代码。它可以根据特定的击键进行调整。 while循环将一直运行,直到用户按下某个键。
import time
import threading
# set global variable flag
flag = 1
def normal():
global flag
while flag==1:
print('normal stuff')
time.sleep(2)
if flag==False:
print('The while loop is now closing')
def get_input():
global flag
keystrk=input('Press a key \n')
# thread doesn't continue until key is pressed
print('You pressed: ', keystrk)
flag=False
print('flag is now:', flag)
n=threading.Thread(target=normal)
i=threading.Thread(target=get_input)
n.start()
i.start()
答案 3 :(得分:1)
使用msvcrt
模块作为thebjorn建议,我能够提出一些有效的方法。以下是一个基本示例,如果按任何键,将退出循环,而不仅仅是输入。
import msvcrt, time
i = 0
while True:
i = i + 1
if msvcrt.kbhit():
break
time.sleep(0.1)
print i
答案 4 :(得分:1)
你需要的是一个非阻塞的原始输入,如果你不想使用线程,有一个简单的解决方案,如下所示,他正在执行20毫秒的超时,然后如果用户没有引发异常如果他按了一个键,那么该类会返回按下的键。
import signal
class AlarmException(Exception):
pass
def alarmHandler(signum, frame):
raise AlarmException
def nonBlockingRawInput(prompt='', timeout=20):
signal.signal(signal.SIGALRM, alarmHandler)
signal.alarm(timeout)
try:
text = raw_input(prompt)
signal.alarm(0)
return text
except AlarmException:
print '\nPrompt timeout. Continuing...'
signal.signal(signal.SIGALRM, signal.SIG_IGN)
return ''
答案 5 :(得分:0)
我无法获得一些流行的答案。所以我使用CTRL
+想出了另一种方法C
插上用户输入和吸收一个键盘中断。一个简单的解决方案是使用try-catch块,
i = 0
try:
while True:
i+=1
print(i)
sleep(1)
except:
pass
# do what you want to do after it...
我从运行诸如flask和django之类的许多服务器中得到了这个想法。这可能是从什么OP要求略有不同,但它可能会帮助别人谁希望类似的事情。
答案 6 :(得分:0)
我已经定义了要求用户输入数字并返回该数字的阶乘的函数。如果用户想停止,他们必须按 0,然后它将退出循环。我们可以指定任何特定的键来输入“n”以退出循环。
import math
def factorial_func(n):
return math.factorial(n)
while True:
n = int(input("Please enter the number to find factorial: "))
print(factorial_func(n))
if n == 0:
exit()