Obsługa błędów za pomocą skryptu python w ArcGIS 10

10

Mam skrypt Pythona, którego używam do utworzenia listy wszystkich plików mxd (z pełną ścieżką) w naszym folderze Projekty. Następnie skrypt używa go do iteracji listy i wykonywania ścieżek szukania / odnawiania na każdym mxd zgodnie z instrukcją ESRI. Mam problemy z trafieniem uszkodzonego pliku MXD. Próbowali wypróbować / wyjątek i nie udało im się go uruchomić. Idealną sytuacją byłoby zapisanie uszkodzonej nazwy pliku do pliku i przejście dalej, aby na koniec móc do nich wrócić. Jestem bardzo nowy w skryptach Pythona, każda pomoc byłaby bardzo mile widziana.

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
źródło

Odpowiedzi:

7

Pierwszą rzeczą do zrobienia jest umieszczenie górnej części forpętli poza tryinstrukcją. Chcesz przejść do iteracji, zanim dasz temu tryoświadczeniu szansę na zabicie operacji. Następnie musisz dodać kilka wierszy, aby otworzyć dziennik błędów i zapisać nazwy plików uszkodzonych plików.

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")
Jason
źródło
2
+1 Fajny, pobij mnie! Nie otwieraj jednak pliku dziennika za pomocą 'w'(rite) - 'a'zamiast tego użyj (ppend), jakby za każdym razem było więcej niż jeden uszkodzony plik mxd. Ponadto może to być przesada, ale loggingwarto sprawdzić moduł Python, aby rejestrować błędy.
om_henners
Niezły haczyk ... naprawiono kod otwierający plik 'a'do dołączenia.
Jason
Nadal nie działa ze zmodyfikowanym kodem. Sprawdziłem, czy pliki nie są uszkodzone, ale rozumiem, że system Windows 7 twierdzi, że zawiesił się i zabija skrypt. Jakieś pomysły?
bworthington
Jaki masz błąd? Czy możesz opublikować resztę kodu?
Jason
1
Mam 2 sugestie: 1. Nie twórz ponownie plików dziennika i dziennika. Mam małe logowanie do Pythona na sgillies.net/blog/832/python-logging, które ma inne dobre linki. 2. Rozważ rzucenie wywołania na arcpy.AddError, ponieważ piszesz własną akcję obsługi.
sgillies
3

Nie ma to nic wspólnego z błędem na uszkodzonych dyskach MXD, ale ponieważ chcesz się zalogować, oto mały samorodek (prawie prosto z dokumentacji Pythona) przy użyciu loggingmodułu (jak sugeruje @om_henners). Komentarz @sgillies powyżej również wygląda doskonale.

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))

Po uruchomieniu w stanie, w jakim się znajduje, daje:

wprowadź opis zdjęcia tutaj

Chad Cooper
źródło