2012-04-08 3 views
1

У меня есть сценарий Python, который for-loops через некоторые объекты и извлекает данные из url в xml-формате и сохраняет его в MySQL db. Я прикрепил (упрощенную) версию сценария ниже. Я планирую запуск сценария один раз в день с помощью Планировщика заданий Windows. Сценарий и планирование работают отлично, но один или два раза в месяц сценарий неожиданно заканчивается где-то на полпути без каких-либо занесенных в журнал исключений. Когда я обнаруживаю, что сценарий завершен и вручную перезапущен скрипт, он завершается без каких-либо проблем и без каких-либо изменений. Планировщик Windows никогда не сообщает о каких-либо проблемах, когда сценарий заканчивается преждевременно, т. Е. Вкладка «История» только сообщает о завершенных действиях/заданиях, как это происходит, когда все работает так, как планировалось.Сценарий Python неожиданно заканчивается с Windows Scheduler

Упрощенная версия сценария:

for Obj in objects: 
    t=0 
    dbdata = '' 
    logger.info('Object: {s}\tID: {i}'.format(s=Obj.name, i=Obj.id)) 
    try: 
     url = 'http://www.xyz.com/webproxy/DataProxy.aspx?Object=' + Obj.id 
     logger.debug(url) 
     data = urlopen(url) 
     dom = minidom.parse(data) 
     for node in reversed(dom.getElementsByTagName('t')): 
      dbdata = dbdata + str(node.getAttribute('t')) + '\t' + str(float(node.getAttribute('p'))) + '\t' + str(int(node.getAttribute('v'))) + '\t' + str(node.getAttribute('id')) + '\t' + str(node.getAttribute('b')) + '\t' + str(node.getAttribute('s')) + '\n' 
      t=t+1 
     if len(dbdata)>0: 
      cursor.execute(sql,(Obj.id,Obj.name,daydb,dbdata)) 
     logger.info('# rows: {n}'.format(n=t) 
    except HTTPError, e: 
     logger.error(e.msg) 
     logger.error('HTTPError. Error code: ' + str(e.code)) 
    except ExpatError, ex: 
     logger.error(ex.msg) 
     logger.error('Expat Error. Error code: ' + str(ex.code)) 
    except Exception, e: 
     logger.error(e.msg) 
     logger.error('Exception. Error code: ' + str(e.code)) 

Кто-нибудь есть какие-либо идеи, почему сценарий завершается преждевременно каждый раз в то время, или если есть что-нибудь, что я могу сделать в сценарии или в расписании для избежать этой проблемы или хотя бы добавить некоторую ясность в то, что происходит? Спасибо

+0

Из того, что я могу видеть, если у вас нет абсолютно никаких журналов, единственная причина, почему это произойдет, если 'objects == []'. Вы не опубликовали какой-либо код, чтобы показать, как создаются «объекты». Другая возможность заключается в том, что логгер выбрал исключение, потому что он не мог открыть запись в файл журнала/stdout. – astevanovic

+0

ОК, я не включил весь сценарий. У меня есть журнал, который производит журналы и работает нормально. Когда сценарий заканчивается неожиданно, журналы выглядят так, как будто он только сделал это на полпути, извлекая, возможно, 50 из 100 элементов, а журналы не показывают признаков исключений или каких-либо других проблем. Это похоже на то, что кто-то, может быть, планировщик (?), Прекратил выполнение сценария. – hgus1294

+0

Вы уверены, что буфер журнала фактически покраснел, когда исключение происходит до завершения сценария? Возможно, было исключение, но он никогда не попадал в журнал. Это единственное, о чем я могу думать ... В противном случае ваш планировщик убивает процесс. – astevanovic

ответ

2

Вы сказали: «без каких-либо занесенных в журнал исключений»?

Это может быть потому, что исключение не является базовым классом всех исключений

>>> help(Exception) 
Help on class Exception in module exceptions: 

class Exception(BaseException) 
| Common base class for all non-exit exceptions. 
| 
| Method resolution order: 
|  Exception 
|  BaseException 
|  __builtin__.object 

BaseException является базовым классом.

Однако я рекомендую, если вы хотите, чтобы получить все исключения:

try: 
    ... 
except: 
    import sys 
    error_type, error, traceback = sys.exc_info() 

Таким образом, вы также поймать SystemExit

>>> SystemExit.mro() 
[<type 'exceptions.SystemExit'>, <type 'exceptions.BaseException'>, <type 'object'>] 
+0

Спасибо. Это кажется разумным предложением и возможным решением. Я проверю его и вернусь обратно. – hgus1294

+0

Это сделало трюк, чтобы я теперь поймал и зарегистрировал исключения. Спасибо вам. – hgus1294