Tratamento de erros com script python no ArcGIS 10

10

Eu tenho um script python que estou usando para criar uma lista de todos os arquivos mxd (com o caminho completo) em nossa pasta Projetos. O script então usa isso para percorrer a lista e fazer uma busca e substituição de caminhos de espaço de trabalho em cada mxd de acordo com as instruções da ESRI. Estou com problemas quando acerto um arquivo mxd corrompido. Eles tentaram tentar / exceto e não conseguiram fazer funcionar. A situação ideal seria gravar o nome de arquivo corrompido em um arquivo e seguir em frente para que eu possa retornar a eles no final. Eu sou muito novo com scripts python, qualquer ajuda seria muito apreciada.

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
fonte

Respostas:

7

A primeira coisa a fazer é trazer o topo do seu forloop para fora da trydeclaração. Você deseja entrar em sua iteração antes de dar à tryinstrução a chance de interromper sua operação. Em seguida, adicione algumas linhas para abrir um log de erros e gravar nomes de arquivos com arquivos corrompidos.

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
fonte
2
+1 Bom, me derrote! No entanto, não abra o arquivo de log com 'w'(rite) - use 'a'(ppend) como se houvesse mais de um mxd corrompido que você substituirá a cada vez. Além disso, pode ser um exagero, mas loggingvale a pena examinar o módulo Python para registrar erros.
Om_henners
Boa captura ... corrigido o código para abrir o arquivo e 'a'anexá-lo.
27412 Jason
Ainda está falhando com o código modificado. Eu verifiquei que os arquivos não estão corrompidos, mas o local onde o Windows 7 alega ter sido interrompido e mata o script. Alguma ideia?
bworthington
Qual é o erro que você esta tendo? Você pode postar o restante do código?
27412 Jason
1
Eu tenho 2 sugestões: 1. Não reinvente o log e os arquivos de log. Eu tenho um pequeno tutorial sobre o Python em sgillies.net/blog/832/python-logging que possui outros bons links. 2. Considere abandonar a chamada para arcpy.AddError, pois você está escrevendo sua própria ação do manipulador.
sgillies
3

Isso não tem nada a ver com o seu erro nos MXDs corrompidos, mas como você deseja fazer logon, aqui está um pequeno pedaço básico (praticamente direto dos documentos do Python) usando o loggingmódulo (como sugerido por @om_henners). O comentário do @sgillies acima parece excelente também.

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 executado como está, fornece:

insira a descrição da imagem aqui

Chad Cooper
fonte