आर्कगिस 10 में अजगर स्क्रिप्ट के साथ हैंडलिंग में त्रुटि


10

मेरे पास एक पायथन स्क्रिप्ट है जिसका उपयोग मैं अपने प्रोजेक्ट फ़ोल्डर में सभी mxd फ़ाइलों (पूर्ण पथ के साथ) की एक सूची बनाने के लिए कर रहा हूं। स्क्रिप्ट तब सूची के माध्यम से पुनरावृत्ति करने के लिए उस का उपयोग करता है और ईएसआरआई के प्रति प्रत्येक mxd पर एक खोज-खोज कार्यक्षेत्रस्पेसपथ करता है। मैं समस्याओं में भाग रहा हूं जब मैंने एक भ्रष्ट 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'(संस्कार) के साथ नहीं खोलें - 'a'इसके बजाय (ppend) का उपयोग करें जैसे कि एक से अधिक भ्रष्ट mxd हैं जिन्हें आप प्रत्येक बार अधिलेखित करेंगे। इसके अलावा, यह ओवरकिल हो सकता है, लेकिन पायथन loggingमॉड्यूल रिकॉर्ड त्रुटियों को देखने लायक हो सकता है।
om_henners

अच्छी पकड़ ... फ़ाइल 'a'को अपेंड करने के लिए खोलने के लिए कोड तय किया ।
जेसन

यह संशोधित कोड के साथ अभी भी विफल है। मैंने सत्यापित किया है कि फाइलें भ्रष्ट नहीं हैं, लेकिन मुझे वह मिलता है जहां विंडोज 7 ने दावा किया है कि यह लटका हुआ है और स्क्रिप्ट को मारता है। कोई विचार?
बोरवर्थिंगटन

आपको क्या त्रुटि हो रही है? क्या आप बाकी कोड पोस्ट कर सकते हैं?
जेसन

1
मेरे पास 2 सुझाव हैं: 1. लॉगिंग और लॉग फ़ाइलों को सुदृढ़ न करें। मुझे थोड़ा सा लॉगऑन मिल गया है जिसमें sgillies.net/blog/832/python-logging पर अन्य अच्छे लिंक हैं। 2. अपने खुद के हैंडलर एक्शन लिखने के बाद से कॉल को dpying पर विचार करें।
sgillies

3

यह भ्रष्ट MXDs पर आपकी त्रुटि से कोई लेना-देना नहीं है, लेकिन जब से आप लॉग इन करना चाहते हैं, तो यहां loggingमॉड्यूल का उपयोग करके थोड़ा नंगे-हड्डियों की डली (पायथन डॉक्स से बहुत सीधे) है (जैसा कि @om_htters द्वारा सुझाया गया है)। @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))

जब-जब चलता है, यह देता है:

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.