ArcGIS 10'da python betiği ile hata işleme


10

Projeler klasörümüzde (tam yol ile) tüm mxd dosyalarının bir listesini oluşturmak için kullandığım bir python komut dosyası var. Komut dosyası daha sonra listeyi yinelemek ve her bir mxd'de nasıl yapılacağını gösteren bir findandreplaceworkspacepath yapmak için kullanır. Bozuk bir mxd dosyasına çarptığımda sorunla karşılaşıyorum. Denedim denedim / hariç ve işe aldık değil. İdeal durum, bozuk dosya adını bir dosyaya yazmak ve devam etmek, böylece sonunda onlara geri dönebilirim. Python komut dosyalarında çok yeniyim, herhangi bir yardım çok takdir edilecektir.

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

Yanıtlar:


7

Yapılacak ilk şey, döngünüzün tepesini ifadenin fordışına çıkarmaktır try. İfadeye tryoperasyonunuzu öldürme şansı vermeden önce yinelemenize girmek istiyorsunuz . Ardından, bir hata günlüğü açmak ve bozuk dosyaların dosya adlarını yazmak için birkaç satır eklemek isteyeceksiniz.

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 Güzel olan, beni dövdü! Ancak, günlük dosyasını 'w'(rite) ile açmayın - 'a'her seferinde üzerine yazacağınız birden fazla bozuk mxd varmış gibi (ppend) kullanın. Ayrıca, aşırıya kaçmış olabilir, ancak Python loggingmodülü hataları kaydetmeye değer olabilir.
om_henners

Güzel yakalamak ... 'a'eklemek için dosyayı açmak için kod düzeltildi .
Jason

Değiştirilen kodla hala başarısız oluyor. Dosyaların bozuk olmadığını doğruladım, ancak Windows 7'nin asılı olduğunu ve komut dosyasını öldürdüğünü iddia ettiği yerde aldım. Herhangi bir fikir?
bworthington

Aldığınız hata nedir? Kodun geri kalanını gönderebilir misiniz?
Jason

1
2 öneri var: 1. Günlük ve günlük dosyalarını yeniden icat etmeyin. Diğer iyi bağlantıları olan sgillies.net/blog/832/python-logging adresinde küçük bir Python günlüğü howto var . 2. Kendi işleyici eyleminizi yazdığınız için çağrıyı arcpy.AddError öğesine atmayı düşünün.
sgillies

3

Bunun bozuk MXD'lerdeki hatanızla bir ilgisi yoktur, ancak giriş yapmak istediğiniz için, loggingmodülü (@om_henners tarafından önerildiği gibi ) kullanarak küçük bir çıplak kemikli külçe (hemen hemen Python belgelerinden ). @sgillies yukarıdaki açıklama da mükemmel görünüyor.

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

Olduğu gibi çalıştırıldığında şunları verir:

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.