2012-02-16 227 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