Surrounding
wednesday
Сижу, работаю
— пишу скрипт
на Python, с целью сделать из этого скрипта
службу геопроцессинга
для сервера ArcGIS. Поскольку скрипт
работает в качестве службы, то с отладкой
не все просто. Применяю свой излюбленный
прием, вывод всего подряд в журнал —
лог-файл, благо в Python есть развесистая
библиотека
для этого.
В какой-то
момент включаю в настройках скрипта
галочку «in
process», и понеслась — записи в журнале
начали дублироваться, с каждым новым
запросом службы добавляется по дублю.
Что характерно, если убрать галочку «ин
процесс», то никаких дублей не наблюдается.
Какие могут
быть гипотезы? Да любые. А правильная —
хост не выгружает модуль скрипта из
памяти по завершению, поэтому при каждом
новом запуске, в застрявший в памяти
обьект журнала добавляется новый хандлер
файла для записи. Если более общо —
глобальные переменные не зачищаются
по завершении работы модуля. Даже
logging.shutdown() не помогает.
В итоге разборок
родился грязный хак (по уму надо бы
завернуть всю логику в класс с конструктором
и деструктором) для ловли повторной
инициализации глобального обьекта.
За вычетом
несущественных для данной темы деталей,
скрипт вышел такой
import logging logFilename = '//cache/MXD/seismo/seismodensity.geoproc.log' log = logging.getLogger('seismodens') # http://docs.python.org/library/logging.html def setLogger(log): log.setLevel(logging.DEBUG) formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') if not hasattr(log, 'vFHandle'): fh = logging.FileHandler(logFilename) fh.setLevel(logging.DEBUG) fh.setFormatter(formatter) log.addHandler(fh) log.vFHandle = fh print 'Log configured. Look file [%s] for messages' % logFilename def main(note=''): setLogger(log) log.info('start, argv: %s, note "%s"' % (argv, note)) import arcpy try: arcpyStuff() except Exception, e: arcpy.AddError(e) if type(e).__name__ == 'COMError': log.error('main, COM error, msg [%s]' % e) else: log.exception('main program failed') raise finally: log.info('logging shutdown') logging.shutdown() if __name__ == "__main__": try: main() except Exception, e: if type(e).__name__ == 'COMError': print 'COM error, msg [%s]' % e else: print 'Error, program failed:' traceback.print_exc(file=sys.stderr) |
Вся фишка тут
if not hasattr(log, 'vFHandle'):
Теперь журнал выглядит как положено.
original post http://vasnake.blogspot.com/2012/10/blog-post_8.html
original post http://vasnake.blogspot.com/2012/10/blog-post_8.html
Комментариев нет:
Отправить комментарий