Gestione degli errori con script Python in ArcGIS 10


10

Ho uno script Python che sto usando per creare un elenco di tutti i file mxd (con percorso completo) nella nostra cartella Progetti. Lo script quindi lo utilizza per scorrere l'elenco e fare un findandreplaceworkspacepaths su ogni mxd secondo ESRI come fare. Sto riscontrando problemi quando ho colpito un file mxd danneggiato. Hanno provato / tranne e non sono riusciti a farlo funzionare. La situazione ideale sarebbe quella di scrivere il nome file corrotto in un file e andare avanti così posso tornare da loro alla fine. Sono molto nuovo con lo scripting Python, qualsiasi aiuto sarebbe molto apprezzato.

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

Risposte:


7

La prima cosa da fare è portare la parte superiore del forciclo al di fuori trydell'istruzione. Vuoi entrare nella tua iterazione prima di dare alla trydichiarazione la possibilità di uccidere l'operazione. Successivamente ti consigliamo di aggiungere alcune righe per aprire un registro degli errori e scrivere nomi di file corrotti.

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 Bello, battimi! Tuttavia, non aprire il file di registro con 'w'(rite) - usa 'a'(ppend) invece come se ci fosse più di un mxd corrotto che sovrascrivi ogni volta. Inoltre, potrebbe essere eccessivo, ma loggingvale la pena guardare il modulo Python per registrare gli errori.
om_henners,

Bella cattura ... risolto il codice per aprire il file con 'a'da aggiungere.
Jason,

Sta ancora fallendo con il codice modificato. Ho verificato che i file non sono danneggiati, ma lo ottengo dove Windows 7 afferma che si è bloccato e uccide lo script. Qualche idea?
Bworthington,

Qual è l'errore che stai riscontrando? Puoi pubblicare il resto del codice?
Jason,

1
Ho 2 suggerimenti: 1. Non reinventare la registrazione e i file di registro. Ho un po 'di Python logging howto su sgillies.net/blog/832/python-logging che ha altri buoni collegamenti. 2. Considera di abbandonare la chiamata a arcpy.AddError poiché stai scrivendo la tua azione del gestore.
sgillies,

3

Questo non ha nulla a che fare con il tuo errore sui MXD corrotti, ma poiché vuoi loggarti, ecco un piccolo nugget (praticamente direttamente dai documenti di Python) usando il loggingmodulo (come suggerito da @om_henners). Anche il commento di @sgillies sopra sembra eccellente.

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

Quando eseguito così com'è, dà:

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.