Más

¿Cuál es el ciclo de vida del script de ArcPy en ArcGIS?

¿Cuál es el ciclo de vida del script de ArcPy en ArcGIS?


En el siguiente código, justo antes delarcpy.AddMessage ("¡Finalizado!")declaración He utilizado una consulta de selección. El problema es que el shapefile Testing1 recién creado en el que estoy disparando la consulta no puede ubicar Testing1.

La razón por la que no pudo ubicar Testing1 fue que no estaba presente en la tabla de contenido. Pero cuando elimino la consulta de selección, el código funciona bien y Testing1 se muestra en la tabla de contenido.

¿Porque?

¿Existe un ciclo de vida después del final del script que permita que el shapefile de Testing1 se muestre en la tabla de contenido?

Si hay, ¿cómo puedo agregar eso para que mi consulta de selección funcione?

############################################### ######################### ## Nombre de la herramienta: BetterBusBuffers - Contar viajes en paradas ## Creado por: Melinda Morang, Esri, mmorang @ esri .com ## Última actualización: 4 de abril de 2014 ##################################### ################################## "BetterBusBuffers - Cuenta viajes en paradas BetterBusBuffers proporciona una medida cuantitativa de acceso al transporte público en su ciudad contando la frecuencia de los viajes en transporte público en varias ubicaciones. La herramienta Contar viajes en paradas crea una clase de entidad de sus paradas GTFS y cuenta la cantidad de viajes que visitan cada una durante un período de tiempo, así como la cantidad de viajes por hora y el tiempo máximo entre viajes subsiguientes durante ese período de tiempo. "import arcpy import BBB_SharedFunctions class CustomError (Exception): pass try: # ------ Obtenga parámetros de entrada y configure las cosas. ----- intente: # Ruta para la clase de entidad de salida de paradas GTFS. # Debe ser una clase de entidad de geodatabase de archivos, no un shapefile. outStops = arcpy.GetParameterAsText (0) # GTFS SQL dbase: debe crearse con anticipación. SQLDbase = "C: /Users/Gurminder/Desktop/sir/temp.sql" # arcpy.GetParameterAsText (1) BBB_SharedFunctions.ConnectToSQLDatabase (SQLDbase) # Ventana de día y hora para analizar DayOfWeek = arcpy.GetParameter Extremo inferior de (2) ventana de tiempo (HH: MM en formato de 24 horas) start_time = arcpy.GetParameterAsText (3) # La hora de inicio predeterminada es medianoche si lo dejan en blanco. if start_time == "": start_time = "00:00" # Convertir a segundos start_sec = BBB_SharedFunctions.parse_time (start_time + ": 00") # Fin superior de la ventana de tiempo (HH: MM en tiempo de 24 horas) end_time = arcpy .GetParameterAsText (4) # La hora de finalización predeterminada es 11:59 pm si lo dejan en blanco. if end_time == "": end_time = "23:59" # Convertir a segundos end_sec = BBB_SharedFunctions.parse_time (end_time + ": 00") # ¿Calcularemos el tiempo de espera máximo? Esto ralentiza el cálculo, así que déjelo opcional. CalcWaitTime = arcpy.GetParameterAsText (5) # ¿El usuario desea contar las llegadas o salidas en las paradas? DepOrArrChoice = arcpy. ("escritorio") ArcVersion = ArcVersionInfo ['Versión'] excepto: arcpy.AddError ("Error al obtener las entradas del usuario") raise # ----- Cree una clase de entidad de paradas y agregue campos para los recuentos de viajes en tránsito --- --- #TODO itteration se puede hacer aquí pruebe: arcpy.AddMessage ("Creando una clase de entidad de paradas GTFS…") # Cree una clase de entidad de paradas de tránsito outStops, StopIDList = BBB_SharedFunctions.MakeStopsFeatureClass (outStops) # Agregue un campo al archivo de salida para el número de viajes, el número de viajes / hora y el tiempo de espera máximo si ".shp" en outStops: # Shapefiles no pueden tener nombres de campo largos arcpy.management.AddField (outStops, "NumTrips", "SHORT") arcpy .management.AddField (outStops, "TripsPerHr", "DOBLE") arcpy.management.AddField (outStops, "MaxWaitTm", "SHORT") el se: arcpy.management.AddField (outStops, "NumTrips", "SHORT") arcpy.management.AddField (outStops, "NumTripsPerHr", "DOUBLE") arcpy.management.AddField (outStops, "MaxWaitTime", "SHORT" excepto: arcpy.AddError ("Error al crear la clase de entidad de paradas GTFS") raise # ----- Consulta los datos GTFS para contar los viajes en cada parada ----- intenta: arcpy.AddMessage ("Calculando el número de viajes en tránsito disponibles durante la ventana de tiempo ... ") # Obtenga un diccionario de {stop_id: [[trip_id, stop_time]]} para nuestra ventana de tiempo stoptimedict = BBB_SharedFunctions.CountTripsAtStops (DayOfWeek, start_sec, end_sec, DepOrArr) # TODO ejecute 24 veces para crear 24 shapefile para el lunes, sábado y domingo ----- try: arcpy.AddMessage ("Escribiendo datos de salida…") # Crea un cursor de actualización para agregar numtrips, trips / hr y maxwaittime a se detiene si ArcVersion == "10.0": si ".shp" en outStops: ucursor = arcpy.UpdateCursor (outStops, "", "", "stop_id; NumTrips; TripsPerHr; MaxWaitTm ") #TODO todos los shapefiles deben alternarse aquí para la fila en ucursor: NumTrips, NumTripsPerHr, NumStopsInRange, MaxWaitTime =  BBB_SharedFunctions.RetrieveStatsForSetOfStops ([str (row.getWidseTime), end_top_time], row.NumTrips = NumTrips row.TripsPerHr = NumTripsPerHr if MaxWaitTime == None: row.MaxWaitTm = -1 else: row.MaxWaitTm = MaxWaitTime ucursor.updateRow (fila) else: ucursor = arcpy ". , "stop_id; NumTrips; NumTripsPerHr; MaxWaitTime") para la fila en ucursor: NumTrips, NumTripsPerHr, NumStopsInRange, MaxWaitTime =  BBB_SharedFunctions.RetrieveStatsForSetOfSget_Valla ) row.NumTrips = NumTrips row.NumTripsPerHr = NumTripsPerHr row.MaxWaitTime = MaxWaitTime ucursor.updateRow (fila) else: # Para todo 10.1 y adelante si ".shp" en outStops: ucursor = arcpy.da.outStopsCursor ( stop_id "," NumTrips "," TripsPerHr "," MaxWaitTm "]) else: ucu rsor = arcpy.da.UpdateCursor (outStops, ["stop_id", "NumTrips", "NumTripsPerHr", "MaxWaitTime"]) para la fila en ucursor: NumTrips, NumTripsPerHr, NumStopsInRange, MaxWaitShaitTimered = [0])], stoptimedict, CalcWaitTime, start_sec, end_sec) fila [1] = NumTrips fila [2] = NumTripsPerHr si ".shp" en outStops y MaxWaitTime == Ninguno: fila [3] = -1 más: fila [ 3] = MaxWaitTime ucursor.updateRow (fila) excepto: arcpy.AddError ("Error al escribir en la salida") subir arcpy.SelectLayerByAttribute_management ("Testing1", "NEW_SELECTION", "NumTrips> 0") arcpy.AddMessage ("FinishedMessage! ") arcpy.AddMessage (" Su salida se encuentra en "+ outStops) excepto CustomError: arcpy.AddError (" No se pudieron contar los viajes en las paradas. ") pase excepto: arcpy.AddError (" No se pudieron contar los viajes en las paradas. ") subir arcpy.AddMessage ("Comprobando curosr")

El problema aquí es que se trata de una herramienta de secuencia de comandos. "Testing1" se agrega a su documento de mapa porque es la salida de la herramienta de secuencia de comandos y tiene ArcGIS Desktop configurado para agregar la salida de la herramienta de secuencia de comandos al mapa.

El script en sí no agrega su salida al mapa. Debido a esto, cuando lee la línea 176 e intenta acceder a la capa "Testing1", no existe. No existirá hasta que la secuencia de comandos termine de ejecutarse y ArcGIS Desktop agregue la salida de la herramienta de secuencia de comandos a su documento de mapa. Nuevamente, esta es una operación separada que ocurre fuera de su secuencia de comandos.

Mientras tanto, Testing1.shp existe (o mejor dichooutStopsexiste) una vez que llega a la línea 81. Las líneas 84-92 crean los campos para la clase de entidad mientras los datos se cargan en ella al final de laintentarcuadra en la línea 173.

Entonces ... cómo solucionar esto ...
Tendrás que usararcpy.mappingpara evitar el hecho de que su clase de entidad no se agrega al mapa hasta que sale del script.arcpy.mappingdepende bastante de la versión, por lo que escribiré una muestra que se ajuste a 10.1-10.3.1. Estas líneas rodean la línea 174, justo antes de suarcpy.SelectLayerByAttribute_managementdeclaración.

mxd = arcpy.mapping.MapDocument (r "CURRENT") #Referencia al documento de mapa actual. ¡Solo funciona si ArcGIS Desktop está abierto! df = arcpy.mapping.ListDataFrames (mxd) [0] #Primer marco de datos en el documento. Tenga cuidado si tiene múltiples marcos de datos arcpy.RefreshCatalog () #Asegúrese de que outStops esté disponible para crear Layer addLayer = arcpy.mapping.Layer (outStops) #Esto no agrega la capa al mapa todavía arcpy.mapping.AddLayer (df, addLayer) #Esto agrega la capa al mapa arcpy.RefreshTOC () #Actualiza la TOC para que la capa ahora esté definitivamente disponible para seleccionar arcpy.RefreshActiveView () #Actualiza la vista del mapa también

Para tuDeclaración arcpy.SelectLayerByAttribute_management, cámbielo a esto para hacer referencia a su nueva capa:
arcpy.SelectLayerByAttribute_management (addLayer, "NEW_SELECTION", "NumTrips> 0")


Hasta donde yo sé, no hay ciclo de vida ni nada más. Por lo general, esto sucede si la función de creación no está totalmente terminada.

EDITAR:

ver la respuesta correcta de @ blord-castillo


Primer intento

Tal vez una actualización del catálogo justo antes de laarcpy.SelectLayerByAttribute_management ()ayuda:

# Actualizar la ventana del catálogo para el nuevo directorio arcpy.RefreshCatalog (target_folder)

Segundo intento

Intenta poner la función al final. Quizas elintentar:tiene que terminar:

[…] # Arcpy.SelectLayerByAttribute_management ("Testing1", "NEW_SELECTION", "NumTrips> 0") arcpy.AddMessage ("Finished!") Arcpy.AddMessage ("Su salida se encuentra en" + outStops) excepto CustomError: arcpy. AddError ("No se pudieron contar los viajes en las paradas.") Pase excepto: arcpy.AddError ("No se pudieron contar los viajes en las paradas.") Subir arcpy.AddMessage ("Verificando curosr") # insértelo aquí si arcpy.Exists (outStops) : arcpy.SelectLayerByAttribute_management (outStops, "NEW_SELECTION", "NumTrips> 0") arcpy.AddMessage ("NumTrips> 0 is selected") else: arcpy.AddError ("No encontrado" + outStops + ".")

3er intento

Tratar de usar con-enunciados a medida que busca y actualiza los cursores. Ejemplo:

con arcpy.da.UpdateCursor (fc, ['campoA', 'campoB']) como cursor: para la fila en el cursor: imprimir (fila)

Más información aquí.