Помилка керування сценарієм python в ArcGIS 10


10

У мене є сценарій python, який я використовую для створення списку всіх файлів mxd (з повним контуром) у нашій папці Проекти. Потім скрипт використовує це для повторення списку та виконання остаточнихзамінь для кожного 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 Приємний, побий мене! Однак не відкривайте файл журналу за допомогою 'w'(rite) - використовуйте 'a'(ppend), як ніби є кілька пошкоджених mxd, які ви будете перезаписувати кожного разу. Також це може бути надмірним, але, loggingможливо, варто переглянути модуль Python, щоб записати помилки.
om_henners

Приємний улов ... виправлено код, щоб відкрити файл, який 'a'слід додати.
Джейсон

Він все ще не вдається зі зміненим кодом. Я переконався, що файли не пошкоджені, але я отримую його там, де Windows 7 стверджує, що він повісив і вбиває сценарій. Будь-які ідеї?
Бвортінгтон

Яку помилку ви отримуєте? Чи можете ви опублікувати решту коду?
Джейсон

1
У мене є дві пропозиції: 1. Не винаходити файли журналу та журнали. У мене є невелика робота з реєстрацією Python на sgillies.net/blog/832/python-logging, яка має інші хороші посилання. 2. Поміркуйте, як скинути виклик до arcpy.AddError, оскільки ви пишете власну дію обробника.
sgillies

3

Це не має нічого спільного з вашою помилкою на пошкоджених MXD, але оскільки ви хочете ввійти, ось невеликий самородок з голою кісткою (майже прямо з документів Python) за допомогою 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))

Коли запустити як є, він дає:

введіть тут опис зображення

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.