Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中的连续循环和退出_Python_Continuous - Fatal编程技术网

python中的连续循环和退出

python中的连续循环和退出,python,continuous,Python,Continuous,我有一个脚本,在被调用时会连续运行,每5分钟检查一次我的gmail收件箱。为了让它每5分钟运行一次,我使用了time.sleep函数。然而,我希望用户在我按下q的任何时候结束脚本,这在使用time.sleep时似乎无法完成。有没有关于我如何做到这一点的建议 阿里如果你真的想浪费大量资源,你可以将你的循环切割成200毫秒的块。所以睡眠200毫秒,检查输入,重复直到五分钟过去,然后检查你的收件箱。不过我不推荐 但是,当它处于睡眠状态时,进程被阻塞,直到睡眠结束才会接收输入 哦,作为一个补充说明,如果

我有一个脚本,在被调用时会连续运行,每5分钟检查一次我的gmail收件箱。为了让它每5分钟运行一次,我使用了time.sleep函数。然而,我希望用户在我按下q的任何时候结束脚本,这在使用time.sleep时似乎无法完成。有没有关于我如何做到这一点的建议


阿里

如果你真的想浪费大量资源,你可以将你的循环切割成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'