python中的连续循环和退出
我有一个脚本,在被调用时会连续运行,每5分钟检查一次我的gmail收件箱。为了让它每5分钟运行一次,我使用了time.sleep函数。然而,我希望用户在我按下q的任何时候结束脚本,这在使用time.sleep时似乎无法完成。有没有关于我如何做到这一点的建议python中的连续循环和退出,python,continuous,Python,Continuous,我有一个脚本,在被调用时会连续运行,每5分钟检查一次我的gmail收件箱。为了让它每5分钟运行一次,我使用了time.sleep函数。然而,我希望用户在我按下q的任何时候结束脚本,这在使用time.sleep时似乎无法完成。有没有关于我如何做到这一点的建议 阿里如果你真的想浪费大量资源,你可以将你的循环切割成200毫秒的块。所以睡眠200毫秒,检查输入,重复直到五分钟过去,然后检查你的收件箱。不过我不推荐 但是,当它处于睡眠状态时,进程被阻塞,直到睡眠结束才会接收输入 哦,作为一个补充说明,如果
阿里如果你真的想浪费大量资源,你可以将你的循环切割成200毫秒的块。所以睡眠200毫秒,检查输入,重复直到五分钟过去,然后检查你的收件箱。不过我不推荐 但是,当它处于睡眠状态时,进程被阻塞,直到睡眠结束才会接收输入 哦,作为一个补充说明,如果你在它睡觉的时候按了键,它应该仍然会进入缓冲区,所以当睡眠结束并最终读取输入时,它会被拉出,IIRC。你可以在sys.stdin上使用并加上一个超时。粗略地说,您的主循环将如下所示:
while True:
r,w,e = select.select([sys.stdin], [], [], 600)
if sys.stdin in r: # data available on sys.stdin
if sys.stdin.read() == 'q':
break
# do gmail stuff
为了能够从标准输入法中读取单个字符,您需要将标准输入法置于无缓冲模式。描述了一种替代方案。如果你想让事情变得简单,只需要用户在“q”之后按enter键
我前面提到的-u标志不起作用:它可能会将pyton置于无缓冲模式,但您的终端不会
或者,ncursus可能在这里有所帮助。我只是在暗示,我在这方面没有太多经验;如果我想要一个别致的用户界面,我会使用TkInter。好的。试试这个python代码。。。在linux中测试。很可能无法在Windows上工作-多亏了Aaron在这方面的投入 这是从中派生、复制和修改的
出于好奇,为什么不使用?使用两条线?一个阻止用户输入,另一个运行检查。Try@Emil:libgmail已经过时了。上次我检查它与当前版本的Gmail不兼容。你能让用户点击^C并捕获键盘中断吗?有什么更好的方法来实现这个脚本?让它持续运行,每5分钟检查一次我的gmail。睡眠300毫秒,检查键盘输入,重复这两个步骤1000次。然后检查gmail.Ivo。。。我第一次错过了你的链接。我的帖子已从同一来源复制/修改。然而,我无法使用您的代码让python在无缓冲模式下正常运行。。。你知道-u选项有什么问题吗?-你不行,我只是试了一下。我更新了帖子。如果您真的想要无缓冲,请使用termios magic或NCurseSunFortunaly select仅适用于windows中的套接字。艾伦:这段代码在我的ubuntu机器上运行得很好。或者你的意思是select只在linux上工作?我的意思是它只在nix上工作,正如你所期望的那样。在windows上,它仅适用于套接字。我刚刚查看了手册,不过termios也只能在unix上工作,所以这是一个没有实际意义的问题。您的解决方案仅适用于unix+1
import sys, termios, atexit
from select import select
delay = 1 # in seconds - change this for your needs
# save the terminal settings
fd = sys.stdin.fileno()
new_term = termios.tcgetattr(fd)
old_term = termios.tcgetattr(fd)
# new terminal setting unbuffered
new_term[3] = (new_term[3] & ~termios.ICANON & ~termios.ECHO)
# switch to normal terminal
def set_normal_term():
termios.tcsetattr(fd, termios.TCSAFLUSH, old_term)
# switch to unbuffered terminal
def set_curses_term():
termios.tcsetattr(fd, termios.TCSAFLUSH, new_term)
def getch():
return sys.stdin.read(1)
def kbhit():
dr,dw,de = select([sys.stdin], [], [], delay)
return dr <> []
def check_mail():
print 'Checking mail'
if __name__ == '__main__':
atexit.register(set_normal_term)
set_curses_term()
while 1:
if kbhit():
ch = getch()
break
check_mail()
print 'done'