ArcGIS 10에서 Python 스크립트를 사용한 오류 처리


10

Projects 폴더에 모든 mxd 파일 목록 (전체 경로 지정)을 만드는 데 사용하는 Python 스크립트가 있습니다. 그런 다음 스크립트는이를 사용하여 목록을 반복하고 ESRI의 방법에 따라 각 mxd에서 findandreplaceworkspacepaths를 수행합니다. 손상된 mxd 파일을 쳤을 때 문제가 발생합니다. 시도 / 제외를 시도했지만 작동하지 않았습니다. 이상적인 상황은 손상된 파일 이름을 파일에 쓰고 계속해서 끝까지 다시 돌아올 수 있도록하는 것입니다. 나는 파이썬 스크립팅을 매우 처음 접했고 도움을 주시면 감사하겠습니다.

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

답변:


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'. 매번 덮어 쓰는 손상된 mxd가 두 개 이상인 것처럼 대신 (ppend)를 사용하십시오. 또한 과잉 일 수도 있지만 Python logging모듈은 오류를 기록 할 가치가 있습니다.
om_henners

좋은 캐치 ... 파일 'a'을 추가 할 코드를 수정했습니다 .
Jason

수정 된 코드로 여전히 실패합니다. 파일이 손상되지 않았 음을 확인했지만 Windows 7에서 중단되었다고 주장하고 스크립트를 종료하는 위치에 있습니다. 어떤 아이디어?
bworthington

당신이 얻는 오류는 무엇입니까? 나머지 코드를 게시 할 수 있습니까?
Jason

1
두 가지 제안이 있습니다. 1. 로깅 및 로그 파일을 다시 만들지 마십시오. 다른 좋은 링크가 있는 sgillies.net/blog/832/python-logging에 약간의 Python 로깅 하우투 가 있습니다. 2. 자신 만의 핸들러 동작을 작성하고 있으므로 arcpy.AddError 호출을 버리는 것을 고려하십시오.
sgillies

3

이것은 손상된 MXD에 대한 오류와 아무 관련이 없지만, 로그하기를 원하기 때문에 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))

있는 그대로 실행하면 다음이 제공됩니다.

여기에 이미지 설명을 입력하십시오

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.