Python:始终运行程序
问题描述:
我希望此代码永不中断。所以我创建了一个无限循环,并在开始时创建了一个“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
答
如果你想确保代码永远不会停止运行,你就必须抓住了在again
引发的任何异常。请阅读Python Exception handling.
由于您处于无限循环(通常不是一个好主意),因此您需要确保异常处理更加智能,解决导致异常的条件。否则,你最终不会反复做任何事情。
答
没有任何“转到”在这里(或在Python中的任何地方),也不会这样确保如果循环打破它会继续运行,原因有二:
如果有异常(如如
imaplib.abort
被抛出,程序将退出它在任何功能。只有一个try /除了会从结局阻止它。不管这个程序运行,
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
答
尝试更换again()
此:
def main():
while(True):
try:
again()
except:
pass
if __name__ == "__main__":
main()
答
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
你可能想试试这个。
您的连接在您的搜索调用中没有收到任何数据,或者它到达文件末尾,这就是它返回套接字错误的原因。在调用re.search()之前,可能会添加EOF检查。此外,通常无限循环是危险的,您可能想要添加某种破坏条件。 – kand 2012-02-16 19:53:16
或者发现异常。 – MRAB 2012-02-16 19:55:48