Gestion des erreurs avec le script python dans ArcGIS 10

10

J'ai un script python que j'utilise pour créer une liste de tous les fichiers mxd (avec chemin complet) dans notre dossier Projets. Le script utilise ensuite cela pour parcourir la liste et faire un findandreplaceworkspacepaths sur chaque mxd selon la procédure de ESRI. Je rencontre des problèmes lorsque je frappe un fichier mxd corrompu. Ils ont essayé try / except et ne l'ont pas fait fonctionner. La situation idéale serait d'écrire le nom de fichier corrompu dans un fichier et de continuer pour que je puisse y revenir à la fin. Je suis très nouveau avec les scripts python, toute aide serait grandement appréciée.

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
la source

Réponses:

7

La première chose à faire est de placer le haut de votre forboucle en dehors de l' tryinstruction. Vous voulez entrer dans votre itération avant de donner à l' tryinstruction une chance de tuer votre opération. Ensuite, vous voudrez ajouter quelques lignes pour ouvrir un journal des erreurs et écrire les noms de fichiers des fichiers corrompus.

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
la source
2
+1 Joli, bat-moi! Cependant, n'ouvrez pas le fichier journal avec 'w'(rite) - utilisez 'a'plutôt (ppend) comme s'il y avait plus d'un mxd corrompu que vous écraseriez à chaque fois. En outre, cela peut être exagéré, mais le loggingmodule Python peut valoir la peine d'être examiné pour enregistrer les erreurs.
om_henners
Belle prise ... correction du code pour ouvrir le fichier avec 'a'à ajouter.
Jason
Il échoue toujours avec le code modifié. J'ai vérifié que les fichiers ne sont pas corrompus mais je les obtiens là où Windows 7 prétend qu'ils se sont bloqués et tue le script. Des idées?
bworthington
Quelle est l'erreur que vous obtenez? Pouvez-vous publier le reste du code?
Jason
1
J'ai 2 suggestions: 1. Ne réinventez pas la journalisation et les fichiers journaux. J'ai un petit howto de journalisation Python sur sgillies.net/blog/832/python-logging qui a d'autres bons liens. 2. Pensez à abandonner l'appel à arcpy.AddError puisque vous écrivez votre propre action de gestionnaire.
sgillies
3

Cela n'a rien à voir avec votre erreur sur les MXD corrompus, mais puisque vous voulez vous connecter, voici un petit nugget à nu (à peu près directement à partir des documents Python) utilisant le loggingmodule (comme suggéré par @om_henners). Le commentaire de @sgillies ci-dessus semble également excellent.

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

Lorsqu'il est exécuté tel quel, il donne:

entrez la description de l'image ici

Chad Cooper
la source