Xử lý lỗi với tập lệnh python trong ArcGIS 10


10

Tôi có một tập lệnh python mà tôi đang sử dụng để tạo danh sách tất cả các tệp mxd (có đường dẫn đầy đủ) trong thư mục Dự án của chúng tôi. Tập lệnh sau đó sử dụng tập lệnh đó để lặp qua danh sách và thực hiện một findandreplaceworkspacepaths trên mỗi mxd trên mỗi ESRI. Tôi đang gặp vấn đề khi tôi nhấn một tập tin mxd bị hỏng. Họ đã thử / ngoại trừ và không làm cho nó hoạt động. Tình huống lý tưởng là ghi tên tệp bị hỏng vào một tệp và di chuyển để cuối cùng tôi có thể quay lại với chúng. Tôi rất mới với kịch bản python, bất kỳ trợ giúp sẽ được đánh giá rất cao.

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

Câu trả lời:


7

Điều đầu tiên cần làm là đưa đầu forvòng lặp của bạn ra ngoài trycâu lệnh. Bạn muốn nhận được vào vòng lặp của mình trước khi bạn đưa ra trytuyên bố có cơ hội giết chết hoạt động của bạn. Tiếp theo, bạn sẽ muốn thêm một vài dòng để mở nhật ký lỗi và ghi tên tệp của các tệp bị hỏng.

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 Một trong những tốt đẹp, đánh bại tôi với nó! Tuy nhiên, đừng mở tệp nhật ký bằng 'w'(nghi thức) - sử dụng 'a'(ppend) thay vào đó như thể có nhiều hơn một mxd bị hỏng, bạn sẽ ghi đè lên mỗi lần. Ngoài ra, nó có thể là quá mức cần thiết, nhưng loggingmô-đun Python có thể đáng xem xét để ghi lại lỗi.
om_henners

Bắt tốt ... đã sửa mã để mở tệp 'a'để chắp thêm.
Jason

Nó vẫn không thành công với mã sửa đổi. Tôi đã xác minh rằng các tệp không bị hỏng nhưng tôi nhận được nó khi Windows 7 tuyên bố rằng nó đã bị treo và giết chết tập lệnh. Có ý kiến ​​gì không?
bworthington

bạn đang gặp phải rắc rối gì vậy? Bạn có thể gửi phần còn lại của mã?
Jason

1
Tôi có 2 đề xuất: 1. Không phát minh lại tệp nhật ký và nhật ký. Tôi đã có một chút đăng nhập Python tại sgillies.net/blog/832/python-logging có các liên kết tốt khác. 2. Xem xét từ bỏ cuộc gọi đến arcpy.AddError kể từ khi bạn viết hành động xử lý của riêng bạn.
sgillies

3

Điều này không liên quan đến lỗi của bạn trên các MXD bị hỏng, nhưng vì bạn muốn đăng nhập, nên đây là một mẩu nhỏ (khá nhiều từ các tài liệu Python) sử dụng loggingmô-đun (như được đề xuất bởi @om_henners). @sgillies bình luận ở trên trông cũng xuất sắc.

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

Khi chạy nguyên trạng, nó cho:

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.