4 votos

ListFields no funciona desde Python Toolbox

He creado una pequeña herramienta arcpy script que funciona bien cuando la ejecuto desde ArcMap. Todo lo que hace es una lista de los campos de una capa especificada.

import arcpy
myLayer = arcpy.GetParameter(0)
fieldList = arcpy.ListFields(myLayer)
for field in fieldList:
    arcpy.AddMessage(field.name)

Sin embargo, si creo una caja de herramientas de Python con este mismo script, falla en fieldList = arcpy.ListFields(myLayer) con este error:

Traceback (most recent call last):
  File "<string>", line 37, in execute
  File "c:\program files (x86)\arcgis\desktop10.3\arcpy\arcpy\__init__.py", line 1131, in ListFields
    return gp.listFields(dataset, wild_card, field_type)
  File "c:\program files (x86)\arcgis\desktop10.3\arcpy\arcpy\geoprocessing\_base.py", line 344, in listFields
    self._gp.ListFields(*gp_fixargs(args, True)))
IOError: "" does not exist

Failed to execute (TestPYTListFields).

Si reemplazo fieldList = arcpy.ListFields(myLayer) con fieldList = arcpy.Describe(myLayer).fields funciona como se esperaba.

¿Por qué mi ListFields() fallar desde una caja de herramientas de Python, y qué puedo poner para que funcione?

Sospecho que puede ser algo relacionado con el objeto Feature Layer, ya que también tengo fallos en los Cursores de Búsqueda cuando hacen referencia a los objetos Feature Layer, aunque no lo he probado en la misma medida que los ListFields.

A continuación, mi PYT completa:

import arcpy

class Toolbox(object):
    def __init__(self):
        self.label = u'ListFields'
        self.alias = ''
        self.tools = [TestPYTListFields]

class TestPYTListFields(object):
    def __init__(self):
        self.label = u'TestPYTListFields'
        self.description = u''
        self.canRunInBackground = False

    def getParameterInfo(self):
        param_1 = arcpy.Parameter()
        param_1.name = u'Input_Layer'
        param_1.displayName = u'Input Layer'
        param_1.parameterType = 'Required'
        param_1.direction = 'Input'
        param_1.datatype = u'Feature Layer'
        return [param_1]

    def isLicensed(self):
        return True

    def updateParameters(self, parameters):
        return

    def updateMessages(self, parameters):
        return

    def execute(self, parameters, messages):
        import arcpy
        myLayer = parameters[0]

        fieldList = arcpy.ListFields(myLayer)         # ListFields doesn't work from PYT
        #fieldList = arcpy.Describe(myLayer).fields   # Describe().fields does work from PYT

        for field in fieldList:
            messages.AddMessage(field.name)
        return

4voto

August Karlstrom Puntos 445

Cuando probé tu script, devuelve miCapa como objeto de parámetro de geoprocesamiento en... y su sin interpretar es una cadena, por lo que su IOError (es decir, ListField espera una ubicación de archivo o una capa que haga referencia a una fuente de datos, que también está vinculada a un archivo).

Si cambia su ListField sintaxis a fieldList = arcpy.ListFields(myLayer.value) funcionará bien. Creo que el problema es similar a la interpretación de las capas de características en su mxd como cadena en el intérprete de Python.

Cualquier herramienta que se ejecute en ArcGIS acepta los nombres de las capas en su TOC como cadena, por ejemplo, arcpy.RepairGeometry_management("aaaaaa_a") funciona perfectamente, pero "aaaaaa_a".dataSource (que uno puede esperar que se interprete como una referencia a la capa de la lógica anterior) lanzará AttributeError: 'str' object has no attribute 'dataSource' .

0 votos

Aunque estoy de acuerdo contigo en la mayor parte, debería recibir un objeto de capa, en lugar de una cadena con un nombre de capa, debido al myLayer = parameters[0] en lugar de myLayer = parameters[0].valueAsText . Esto debería permitirme utilizar el objeto de capa para otras herramientas (como en la herramienta de script original) sin tener que hacer la capa de características. Voy a tener un juego con lo que has sugerido y el informe de vuelta

1 votos

Mi experiencia es que la asignación de una capa de características como parámetro a una herramienta/script es uno de los procesos más complicados en este ámbito. Por eso odio trabajar con arcpy.MakeFeatureLayer_management y prefieren arcpy.mapping.Layer en la medida de lo posible. Esto puede parecer lejano a su pregunta, pero creo que es muy relevante.

1 votos

myLayer.value parece ser la respuesta - esto está haciendo que mi Cursor de Búsqueda funcione en mi otra caja de herramientas también, sin embargo, todavía parece estar tratándolo como el objeto de capa por lo que no necesito hacer capa de características. Muchas gracias.

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