Odio molestarlos a todos con el mismo problema una y otra vez, pero me encuentro con un nuevo problema cada vez que hago un ligero cambio en el código. Todo lo que hice con el siguiente código fue reemplazar los nombres de campo para que coincidan con la clase de entidad original. Ahora no funciona. Me dio
<type 'exceptions.RuntimeError'>: ERROR 999999: Error executing function.
Failed to execute (Script).
Intenté agregar Try / Except al código que no me dio ningún mensaje de error pero tampoco me dio ningún resultado.
No estoy seguro de lo que está pasando? Cualquier ayuda para resolver esto será muy apreciada.
import arcpy, os
Try:
roadpath = arcpy.GetParameterAsText(0)
tablepath = arcpy.GetParameterAsText(1)
datapath = os.path.split(tablepath)[0]
tablename = os.path.split(tablepath)[1]
rows = arcpy.SearchCursor(roadpath,"FROMLEFT <> 0 AND TOLEFT <> 0","","STREET_NAME_ID;FROMLEFT;TOLEFT","STREET_NAME_ID A;FROMLEFT A;TOLEFT A")
arcpy.env.workspace = datapath
if arcpy.Exists(tablename):
arcpy.DeleteRows_management(tablename)
else:
arcpy.CreateTable_management(datapath,tablename,roadpath)
arcpy.DeleteField_management(tablename,"SHAPE_Length")
irows = arcpy.InsertCursor(tablename)
first = True
for row in rows:
if first:
first = False
else:
GISID = row.GIS_ID
stid = row.STREET_NAME_ID
fl = row.FROMLEFT
tl = row.TOLEFT
if stid == prev_stid and fl <= prev_tl:
irow = irows.newRow()
irow.GIS_ID = prev_GISID
irow.STREET_NAME_ID = prev_stid
irow.FROMLEFT = prev_fl
irow.TOLEFT = prev_tl
irows.insertRow(irow)
del irow
irow = irows.newRow()
irow.GIS_ID = GISID
irow.STREET_NAME_ID = stid
irow.FROMLEFT = fl
irow.TOLEFT = tl
irows.insertRow(irow)
del irow
prev_GISID = row.GIS_ID
prev_stid = row.STREET_NAME_ID
prev_fl = row.FROMLEFT
prev_tl = row.TOLEFT
del rows, irows
except:
print arcpy.GetMessages()
rows =
deirows
incluido en un bloque try ... except da un mensaje de error más revelador. También sería útil si puede poner una muestra de los datos y el script completo en alguna parte ( minus.com es un lugar para compartir fácilmente con el público).` `
tablepath
lugar detablename
. ¿Es solo un error tipográfico en el foro o es realmente así en el script? El error sugiere lo primero, entonces, ¿puede proporcionar ejemplos de los valores que está pasando a ambos parámetros? ¿También tienes unaimport arcpy
línea en la parte superior de tu script?Respuestas:
Los parámetros que ha configurado actualmente no deberían ser parámetros de "salida", ya que son argumentos de cadena simples para sus métodos de geoprocesamiento, no salidas verdaderas.
Hay dos formas de hacerlo:
os.path.split
según sea necesario para funciones de geoprocesamiento que está utilizando.ToolValidator
clase de su herramienta de script para establecer su valor después de que los parámetros 2 y 3 hayan sido validados.El primer método es probablemente el camino más fácil: la lógica de ToolValidator es difícil de corregir y difícil de depurar.
EDITAR: en realidad, hay una tercera opción que puede funcionar para sus propósitos: es lo mismo que el método dos, pero en lugar de modificar ToolValidator, llame
SetParameterAsText
al final de su script para establecer el valor del cuarto parámetro derivado. He tenido problemas con SetParameterAsText en el pasado en las herramientas de secuencia de comandos utilizadas en ModelBuilder, pero ahora podría solucionarse.fuente
También me gustaría comentar todo el código e imprimir los valores de los parámetros que está pasando. Siempre es bueno poner un poco de depuración.
También es una buena práctica verificar los parámetros a medida que entran:
Algo así, luego asegúrese de imprimir las variables para poder verlas:
arcpy.AddMessage("ID : " + str(Id))
o
print "ID : " + str(Id)
Etc. Debe saber que los valores que entran no son basura, ya que siempre estará persiguiendo su cola.
Poner la fila / cur en un intento de captura también es una buena práctica.
fuente
Estoy de acuerdo con bla, la dirección de todos sus parámetros debe ser "entrada". Además, está especificando el tipo de datos del parámetro de herramienta 3, la tabla de salida, como un objeto de archivo; intente esto como una "tabla" o "cadena".
fuente