8 votos

Configuración de parámetros en la Herramienta de secuencia de Comandos usando Python?

Yo odio a error a todos con el mismo problema una y otra vez, pero me encuentro con un nuevo problema, cada vez que me haga un pequeño cambio en el código. Todo lo que hice para el código de abajo fue la sustitución de los nombres de campo para que coincida con el original de la clase de entidad. Ahora no funciona. Me dio

<type 'exceptions.RuntimeError'>: ERROR 999999: Error executing function. Failed to execute (Script).

He intentado añadir Try/except para el código que no me da ningún mensaje de error pero no me da 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()

4voto

auramo Puntos 161

Los parámetros que actualmente se han establecido no debe ser en realidad la "salida" de los parámetros, como son simples argumentos de la cadena de geoprocesamiento métodos, no es cierto salidas.

Hay dos maneras que usted puede ir sobre esto:

  1. Reemplace sus dos "Ubicación de Salida" y "Salida" de la Tabla" parámetros de con un solo parámetro de salida de la Tabla de tipo para el suministro de la ruta de acceso completa la tabla de salida, y la actualización de su lógica de secuencias de comandos para analizar este parámetro en el camino necesario el uso de componentes os.path.split según sea necesario para las funciones de geoprocesamiento de usted está utilizando.
  2. Cambiar la Ubicación de Salida" y "Salida" de la Tabla" parámetros de entrada parámetros (también me gustaría cambiar el nombre de "Tabla de Salida" a "de Salida Nombre de la Tabla" para aclarar que es sólo el nombre de la tabla, no la ruta completa). Crear un nuevo cuarto parámetro de tipo de Derivado, y modificar su secuencia de comandos de la herramienta ToolValidator clase para establecer su valor después de los parámetros 2 y 3 han sido validados.

El primer método es probablemente la manera más fácil de llegar (el ToolValidator lógica es difícil de conseguir y difícil de depurar.

EDIT: en Realidad hay una tercera opción que puede funcionar para sus fines, es el mismo método de los dos, pero en lugar de modificar ToolValidator, llame a SetParameterAsText al final de su secuencia de comandos para establecer el valor de la cuarta, derivado de un parámetro. He tenido problemas con SetParameterAsText en el pasado en las herramientas de secuencia de comandos se utiliza en ModelBuilder, pero podría ser fijo ahora.

2voto

mleykamp Puntos 491

También me gustaría mirar a comentar todo el código y la impresión de los valores de los parámetros que están pasando. Siempre es bueno poner en un poco de depuración.

También es una buena práctica, para comprobar la parametsr como vienen en:

# First parameter is ID
ID = long(arcpy.GetParameterAsText(0))

# parameter is optional feature class prefix 
appPrefix = arcpy.GetParameterAsText(1)
if (not appPrefix) or (appPrefix == "#") or (len(appPrefix.strip()) == 0):
    appPrefix = ""

# Optional schema owner
schemaOwner = arcpy.GetParameterAsText(2)
if (not schemaOwner) or (schemaOwner == "#") or (len(schemaOwner.strip()) == 0):
    schemaOwner = ""
else:
    schemaOwner = schemaOwner + "."

# Optional workspace - for use with ArcGIS Desktop. No default.
workspace = arcpy.GetParameterAsText(3)
if (not workspace) or (workspace == "#") or (len(workspace.strip()) == 0):
    workspace = os.path.join(sys.path[0], connFile)

Algo así como que, a continuación, asegúrese de que usted imprima las variables con el fin de que usted pueda ver:

arcpy.AddMessage("ID : " + str(Id))

o

print "ID : " + str(Id)

Etc. Usted necesita saber los valores que va en la no basura, como siempre vas a estar persiguiendo su cola.

Poner la fila/cur en un try catch es una buena práctica.

0voto

Aissen Puntos 131

Estoy de acuerdo con bla, la dirección de todos sus parámetros deben ser "de entrada". También, se especifica el parámetro de la herramienta 3 tipo de datos, la tabla de salida, como un objeto de archivo; tratar esto como una "tabla" o "cadena".

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X