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
Комментариев нет:
Отправить комментарий