Python: будь всегда запущен - PullRequest
       0

Python: будь всегда запущен

0 голосов
/ 16 февраля 2012

Я хочу, чтобы этот код никогда не ломался. Таким образом, я создал бесконечный цикл и начало, если оно сломается. Тем не менее, это все еще не работает.

root@xxx:~# 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("xx@example.com", "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

Ответы [ 4 ]

5 голосов
/ 16 февраля 2012

Здесь нет никакого «goto» (или где-либо еще в Python), и это не гарантирует, что если цикл прервется, он продолжит работать по двум причинам:

  1. Еслиисключение (например, imaplib.abort выдается, программа выйдет из любых функций, в которых она находится. Только попытка / исключение остановит его завершение.

  2. Независимо от того, как работает эта программа, again() будет вызываться только один раз. После вызова функции again() она завершится и продолжит работу после этой точки. не действует как переход, если код выходит изчто цикл 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("xx@example.com", "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
1 голос
/ 17 февраля 2012
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 

Возможно, вы захотите попробовать это.

1 голос
/ 16 февраля 2012

Если вы хотите убедиться, что код никогда не перестанет работать, вам придется перехватывать любые исключения, которые выдают в again. Читайте Обработка исключений Python.

Поскольку вы находитесь в бесконечном цикле (вообще не очень хорошая идея), вы захотите убедиться, что исключения обрабатываются разумно, в первую очередь разрешая условия, которые приводят к возникновению исключения. В противном случае вы просто ничего не сделаете.

0 голосов
/ 16 февраля 2012

Попробуйте поменять местами again()

для этого:

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

if __name__ == "__main__":
    main()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...