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