2012-02-16 212 views
-3

我希望此代码永不中断。所以我创建了一个无限循环,并在开始时创建了一个“goto”。但是,它仍然无法正常工作。Python:始终运行程序

[email protected]:~# cat gmail2.py 
import imaplib, re 
import os 
import time 
import socket 
socket.setdefaulttimeout(60) 

def again(): 
     conn = imaplib.IMAP4_SSL("imap.gmail.com", 993) 
     conn.login("[email protected]", "xxx") 

     while(True): 
       unreadCount = re.search("UNSEEN (\d+)", conn.status("INBOX", "(UNSEEN)")[1][0]).group(1) 
       print unreadCount 

       if int(unreadCount) > 20: 
         os.system('heroku restart --app sss-xxxx-203') 
       #os.system('ls') 
       #print "Restarting server...." 

       time.sleep(60) 

again() 


1 
Traceback (most recent call last): 
    File "gmail2.py", line 22, in <module> 
    again() 
    File "gmail2.py", line 12, in again 
    unreadCount = re.search("UNSEEN (\d+)", conn.status("INBOX", "(UNSEEN)")[1][0]).group(1) 
    File "/usr/lib/python2.6/imaplib.py", line 703, in status 
    typ, dat = self._simple_command(name, mailbox, names) 
    File "/usr/lib/python2.6/imaplib.py", line 1060, in _simple_command 
    return self._command_complete(name, self._command(name, *args)) 
    File "/usr/lib/python2.6/imaplib.py", line 890, in _command_complete 
    raise self.abort('command: %s => %s' % (name, val)) 
imaplib.abort: command: STATUS => socket error: EOF 
+0

您的连接在您的搜索调用中没有收到任何数据,或者它到达文件末尾,这就是它返回套接字错误的原因。在调用re.search()之前,可能会添加EOF检查。此外,通常无限循环是危险的,您可能想要添加某种破坏条件。 – kand 2012-02-16 19:53:16

+1

或者发现异常。 – MRAB 2012-02-16 19:55:48

回答

1

如果你想确保代码永远不会停止运行,你就必须抓住了在again引发的任何异常。请阅读Python Exception handling.

由于您处于无限循环(通常不是一个好主意),因此您需要确保异常处理更加智能,解决导致异常的条件。否则,你最终不会反复做任何事情。

5

没有任何“转到”在这里(或在Python中的任何地方),也不会这样确保如果循环打破它会继续运行,原因有二:

  1. 如果有异常(如如imaplib.abort被抛出,程序将退出它在任何功能。只有一个try /除了会从结局阻止它。

  2. 不管这个程序运行,again()将只调用一次。一旦again()函数被调用后,它会完成,然后在那个点之后继续,它确实是不是充当goto - 如果代码突破while循环,它将不会返回到again函数。

你真正想要的是这样的:

import imaplib, re 
import os 
import time 
import socket 
socket.setdefaulttimeout(60) 

while(True): 
    conn = imaplib.IMAP4_SSL("imap.gmail.com", 993) 
    conn.login("[email protected]", "xxx") 

    try: 
     unreadCount = re.search("UNSEEN (\d+)", conn.status("INBOX", "(UNSEEN)")[1][0]).group(1) 
     print unreadCount 

     if int(unreadCount) > 20: 
      os.system('heroku restart --app sss-xxxx-203') 
     #os.system('ls') 
     #print "Restarting server...." 

     time.sleep(60) 
    except: 
     # an error has been thrown- try again 
     pass 
0

尝试更换again()

此:

def main(): 
    while(True):   
     try: 
      again() 
     except: 
      pass 

if __name__ == "__main__": 
    main() 
1
imap_host = 'imap.gmail.com' 
mail = imaplib.IMAP4_SSL(imap_host) 
mail.login(user,passw) 
mail.select("inbox") # connect to inbox. 

while True: 
    try: 
     result, data = mail.uid('search', None, 'UNSEEN') 
     uid_list = data[0].split() 
     print len(uid_list), 'Unseen emails.' 
     time.sleep(60) 
    except KeyboardInterrupt: 
     print 'Quitting' 
     return 

你可能想试试这个。

+0

它给出了一个错误:SyntaxError:'return'外部函数 – donald 2012-02-26 22:55:38

+0

快速提示:使用'break'而不是'return'。 – Bryan 2012-10-16 23:50:15