Скрипт Pyw умирает через некоторое время

while True:
    try:
        # send some mail
        time.sleep(hours*60*60)
    except:
        time.sleep(60)

Этот скрипт должен отправлять электронное письмо каждые x часов. И это так. Если это не удается, он должен подождать минуту и ​​повторить попытку. Я протестировал его с часами, установленными на 0,01 (36 секунд), и он работал, даже когда я выключал и снова включал Wi-Fi. Но когда я установил его на 2 часа и подождал, ничего не произошло. Процесс Pythonw просто исчез.


person David    schedule 25.03.2017    source источник


Ответы (1)


Вы должны переименовать его в .py и посмотреть вывод консоли.

Или, что еще лучше, настроить логирование необработанных исключений (см. ниже). Как правило, вы должны использовать ведение журнала, чтобы сообщать о ходе выполнения скрипта, если он будет выполняться без присмотра: у вас просто нет другого способа узнать, что с ним происходит!

Например. когда скрипт начинает очень долго ждать, вы можете сообщить, в какой момент он начинает ждать и как долго - это прояснит для вас ситуацию.

Ниже показано, как я настраиваю ведение журнала в своих сценариях, которые должны выполняться в фоновом режиме в течение длительного времени:

# set up logging #####################################
import sys,logging,logging.handlers,os.path
logfile = os.path.splitext(os.path.basename(sys.argv[0]))[0]+".log"
l = logging.getLogger()
l.setLevel(logging.DEBUG)
f = logging.Formatter('%(asctime)s %(process)d:%(thread)d %(name)s %(levelname)-8s %(message)s')
h=logging.StreamHandler(sys.stdout)
h.setLevel(logging.NOTSET)
h.setFormatter(f)
l.addHandler(h)
h=logging.handlers.RotatingFileHandler(logfile,maxBytes=1024**2,backupCount=1)
h.setLevel(logging.NOTSET)
h.setFormatter(f)
l.addHandler(h)
del h,f
#hook to log unhandled exceptions
def excepthook(type,value,traceback):
    logging.error("Unhandled exception occured",exc_info=(type,value,traceback))
    #Don't need another copy of traceback on stderr
    if old_excepthook!=sys.__excepthook__:
        old_excepthook(type,value,traceback)
old_excepthook = sys.excepthook
sys.excepthook = excepthook
del excepthook,logfile
# ####################################################
person ivan_pozdeev    schedule 25.03.2017
comment
Я не понимаю. Кажется, теперь он работает... Интересно, будет ли он работать, когда я отключу ведение журнала. - person David; 25.03.2017
comment
Он сломался через несколько часов после отправки почты. Ошибок в журнале нет. Последнее обновление час и 30 минут назад. Процесс python все еще работает, но скрипт просто ничего не делает. - person David; 26.03.2017
comment
Я беру это обратно. Это работает. Просто небольшая задержка (минут 20-30). Хотя это нормально. Принятие ответа. - person David; 26.03.2017
comment
@David Если вам нужно зацикливаться с постоянной скоростью, вы должны рассчитать время сна из следующей контрольной точки — скорее всего, невыполнение этого условия вызывает задержку: stackoverflow.com/questions/26774186 / - person ivan_pozdeev; 26.03.2017