Обработка ошибок скриптом Python в ArcGIS 10

10

У меня есть скрипт Python, который я использую для создания списка всех файлов MXD (с полным путем) в нашей папке Projects. Затем сценарий использует это для итерации по списку и выполнения findandreplaceworkspacepath для каждого mxd в соответствии с инструкциями ESRI. Я сталкиваюсь с проблемами, когда я ударил поврежденный файл MXD. Они пытались попробовать / кроме, и не получили его на работу. Идеальная ситуация - записать поврежденное имя файла в файл и двигаться дальше, чтобы я мог вернуться к ним в конце. Я очень новичок в написании скриптов на Python, любая помощь будет принята с благодарностью.

import arcpy, os, sys, traceback, time

oldpath = 'W:'
newpath = 'W:\\GIS'

def find(path,pattern):
    matches = []
    for r,d,f in os.walk(path):
        for files in f:
            if files.endswith(pattern):
                fpath = os.path.join(r,files)
                matches.append(fpath)
                print (fpath)
    return matches


print ("Go: ")
mxdlist = (find('C:\\gis','.mxd'))
print (mxdlist)


print ("Starting Path Conversion")
try:
        for mxdold in mxdlist:
            mxd = arcpy.mapping.MapDocument(mxdold)
            mxd.findAndReplaceWorkspacePaths(oldpath, newpath)
            time.sleep(6)
            mxd.save()
            time.sleep(6)
            print (mxdold)
            del mxd
    except arcpy.ExecuteError:    
        arcpy.AddError(arcpy.GetMessages(2))    

    except:    
        arcpy.AddError("Non-tool error occurred")
bworthington
источник

Ответы:

7

Первое, что нужно сделать, это вывести вершину forцикла за пределы tryоператора. Вы хотите войти в свою итерацию, прежде чем дать tryоператору шанс уничтожить вашу операцию. Далее вам нужно добавить несколько строк, чтобы открыть журнал ошибок и записать имена поврежденных файлов.

import arcpy, os, sys, traceback, time

oldpath = 'W:\\'
newpath = 'W:\\GIS'
cgis_dir = 'C:\\gis'

mxdlist = []

print 'Go: '
files = os.listdir(cgis_dir)
for file in files:
    try:
        if file.split('.')[1] == 'mxd':
            mxdlist.append(file)
            print cgis_dir,file
    except:
        pass


print ("Starting Path Conversion")

for mxdold in mxdlist:
    try:
        mxd = arcpy.mapping.MapDocument(mxdold)
        mxd.findAndReplaceWorkspacePaths(oldpath, newpath)
        time.sleep(6)
        mxd.save()
        time.sleep(6)
        print (mxdold)
        del mxd
    except arcpy.ExecuteError:    
        arcpy.AddError(arcpy.GetMessages(2))
        f=open(r'W:\GIS\error.log','a')
        f.write(mxdold,'\n')
        f.close()

    except:    
        arcpy.AddError("Non-tool error occurred")
Джейсон
источник
2
+1 Приятно, обыграй меня! Однако не открывайте файл журнала с помощью 'w'(rite) - используйте 'a'вместо него (ppend), как будто существует более одного поврежденного mxd, который вы будете перезаписывать каждый раз. Кроме того, это может быть излишним, но loggingмодуль Python, возможно, стоит посмотреть, чтобы записывать ошибки.
om_henners
Хороший улов ... исправил код, чтобы открыть файл, 'a'чтобы добавить.
Джейсон
Это все еще терпит неудачу с измененным кодом. Я проверил, что файлы не повреждены, но я получаю его там, где Windows 7 утверждает, что он завис, и убивает скрипт. Любые идеи?
Бвортингтон
Какую ошибку вы получаете? Можете ли вы опубликовать остальную часть кода?
Джейсон
1
У меня есть 2 предложения: 1. Не изобретать журналы и файлы журналов. У меня есть небольшое руководство по регистрации в Python на sgillies.net/blog/832/python-logging, в котором есть и другие хорошие ссылки. 2. Подумайте об отказе от вызова arcpy.AddError, поскольку вы пишете свое собственное действие обработчика.
sgillies
3

Это не имеет ничего общего с вашей ошибкой в ​​поврежденных MXD, но, поскольку вы хотите войти в систему, вот небольшой слепок (в значительной степени прямо из документации по Python) с использованием loggingмодуля (как предложено @om_henners). Комментарий @sgillies выше выглядит также отлично.

import logging
import datetime
import os

date_tag = datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S")
log_file = os.path.join(os.path.dirname(os.curdir), "LogFileTest_%s.log" % date_tag)

# Setup logger
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(levelname)-8s %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S',
                    filename=log_file,
                    filemode='w')
logging.info(': START LOGGING')

try:
    logging.info(": Do something here")
except Exception, err:
    logging.error(": %s" % str(err))

При запуске как есть, это дает:

введите описание изображения здесь

Чед Купер
источник