2012-02-16 2 views
-3

Je veux que ce code ne casse jamais. J'ai donc créé une boucle infinie et un "goto" au début en cas de rupture. Cependant, ça ne marche toujours pas.Python: Toujours exécuter le programme

[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

Votre connexion, à l'intérieur de votre appel de recherche, ne reçoit aucune donnée ou touche la fin d'un fichier et c'est pourquoi elle renvoie une erreur de socket. Peut-être ajouter une vérification pour EOF avant d'appeler re.search(). En outre, les boucles généralement sans fin sont dangereuses, vous pourriez vouloir ajouter une sorte de condition de rupture. – kand

+1

Ou attraper l'exception. – MRAB

Répondre

1

Si vous voulez vous assurer que le code ne cesse de courir, vous aurez à prendre toutes les exceptions qui sont jetés dans again. Lire sur Python Exception handling.

Puisque vous êtes dans une boucle infinie (pas une bonne idée, généralement), vous devez vous assurer que les exceptions sont traitées intelligemment, en résolvant les conditions qui donnent lieu à l'exception en premier lieu. Sinon, vous finirez par ne rien faire à plusieurs reprises.

5

Il n'y a pas « goto » ici (ou ailleurs en Python), ne serait-ce faire en sorte que si la boucle casse il continuer à courir, pour deux raisons:

  1. Si une exception (par exemple comme imaplib.abort est lancé, le programme quittera les fonctions que c'est. seul un try/except serait l'empêcher de fin.

  2. Peu importe comment ce programme fonctionne, again() sera appelée une seule fois. une fois que la fonction again() a été appelé, il se terminera et continuera après ce point not agit comme un goto- si le code sort de cette boucle while, il ne retournera pas à la fonction again.

Qu'est-ce que vous voulez vraiment est quelque chose comme ceci:

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

Essayez d'échanger again()

pour cela:

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 

Vous pourriez vouloir essayer.

+0

il donne une erreur: SyntaxError: 'return' en dehors de la fonction – donald

+0

Astuce: utilisez 'break' au lieu de' return'. – Bryan

Questions connexes