เกิดข้อผิดพลาดในการจัดการกับสคริปต์ python ใน ArcGIS 10


10

ฉันมีสคริปต์ไพ ธ อนที่ฉันใช้เพื่อสร้างรายการไฟล์ mxd ทั้งหมด (พร้อมเส้นทางเต็ม) ในโฟลเดอร์โครงการของเรา จากนั้นสคริปต์จะใช้สิ่งนั้นเพื่อวนซ้ำในรายการและทำ findandreplaceworkspacepaths ในแต่ละ mxd ตามวิธีของ ESRI ฉันพบปัญหาเมื่อฉันกดไฟล์ 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 Nice one, ชนะฉันมัน! อย่างไรก็ตามอย่าเปิดไฟล์บันทึกด้วย'w'(พิธีกรรม) - ใช้'a'(ppend) แทนราวกับว่ามี mxd ที่เสียหายมากกว่าหนึ่งรายการคุณจะเขียนทับทุกครั้ง นอกจากนี้มันอาจ overkill แต่loggingโมดูลPython อาจคุ้มค่าที่จะดูการบันทึกข้อผิดพลาด
om_henners

Nice catch ... แก้ไขรหัสเพื่อเปิดไฟล์ด้วย'a'เพื่อต่อท้าย
เจสัน

มันยังคงล้มเหลวด้วยรหัสแก้ไข ฉันได้ตรวจสอบแล้วว่าไฟล์ไม่เสียหาย แต่ฉันเข้าใจว่า Windows 7 อ้างว่าไฟล์หยุดทำงานและฆ่าสคริปต์ ความคิดใด ๆ
bworthington

คุณได้รับข้อผิดพลาดอะไร คุณสามารถโพสต์รหัสที่เหลือได้ไหม?
เจสัน

1
ฉันมีคำแนะนำ 2 ข้อ: 1. อย่าสร้างไฟล์บันทึกและไฟล์บันทึกใหม่ ฉันมี Python การบันทึกเล็ก ๆ น้อย ๆ ที่sgillies.net/blog/832/python-loggingที่มีลิงค์ดีอื่น ๆ 2. พิจารณาการเรียกไปยัง arcpy.AddError เนื่องจากคุณเขียนการกระทำของคุณเอง
sgillies

3

สิ่งนี้ไม่เกี่ยวข้องกับข้อผิดพลาดของคุณใน MXD ที่เสียหาย แต่เนื่องจากคุณต้องการเข้าสู่ระบบนี่คือนักเก็ตเปลือยกระดูกเล็กน้อย (ค่อนข้างตรงจากเอกสาร Python) โดยใช้loggingโมดูล (ตามที่ @om_henners แนะนำ) @ ความคิดเห็นของ gillies ด้านบนนั้นดูยอดเยี่ยมเช่นกัน

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.