7 votos

La caja de herramientas de Python funciona en ArcToolbox y en la consola de Python, pero no en ArcCatalog

Tengo un conjunto de herramientas de Python en una caja de herramientas de Python (.pyt). Están divididas en múltiples archivos y módulos y han estado funcionando correctamente, pero ahora estoy viendo un comportamiento inconsistente en múltiples máquinas.

Básicamente, puedo ejecutar las herramientas desde el código, puedo importarlas y ejecutarlas desde el shell de Python en ArcMap, y puedo importar la caja de herramientas en ArcToolbox a través de ArcMap y ejecutarlas desde allí. Pero cuando navego a la caja de herramientas en ArcCatalog, cada una de las herramientas tiene una X roja y cuando hago clic derecho "¿Por qué?" me dice:

AttributeError: 'module' object has no attribute 'Parameter'

También me da el mismo error si abro el shell de Python en ArcCatalog y hago:

arcpy.ImportToolbox("C:/path/to/toolbox.tbx")

Aunque ese mismo comando, y la posterior invocación de la herramienta, funciona bien en la consola de ArcMap Python. Esto es en la primera línea que hace referencia a arcpy (esto es toolbox_utils.py).

import arcpy

def make_parameter(displayName, name, datatype, defaultValue=None,
              parameterType='Optional', direction='Input'):
    """
    This method prepopulates the paramaeterType
    and direction parameters and leaves the setting a default value for the
    newly created parameter as optional. The displayName, name and datatype are
    the only required inputs.
    """
    # create parameter with a few defaults
    param = arcpy.Parameter(
        displayName=displayName,
        name=name,
        datatype=datatype,
        parameterType=parameterType,
        direction=direction)

    # set new parameter to a default value
    param.value = defaultValue

    # return the complete parameter object
    return param

He probado a eliminar los archivos .pyc, a eliminar y restablecer los archivos de metadatos .xml y a reducir las herramientas al mínimo. Si pongo una herramienta vacía en una caja de herramientas genérica sin parámetros, funciona. Una vez que trato de romper en los módulos (que estaban trabajando muy bien), empiezo a recibir este error. Es como si ArcCatalog no está resolviendo la referencia arcpy.

EDITAR:

Sólo para que sea más confuso, si abro ArcMap, abro la ventana del Catálogo en ArcMap y busco exactamente la misma caja de herramientas, todas las herramientas funcionan. No hay X rojas. Inicié y detuve ambas aplicaciones - ArcCatalog me da el error, la ventana del Catálogo en ArcMap no lo hace.

Además, he comprobado que ArcMap y ArcCatalog utilizan la misma versión de Python y ambos apuntan a mi Python27 \ArcGIS10.3 directorio.

Proyecto de muestra

Si alguien quiere ver lo que he estado haciendo y ofrecer cualquier mejora, he puesto el proyecto de muestra del que he reducido mi Toolbox real en github. Si alguien quiere ayudarme a ampliarlo en una estructura de muestra realmente ajustada, sería genial. https://github.com/cmpalmer66/SamplePythonToolbox

Esta es mi estructura:

arcpy_utils
  __init__.py
  toolbox_utils.py
service
  __init__.py
  services.py
  settings.py
  test_services.py
toolpackages
  __init__.py
  service_one.py
  service_two.py
toolbox.pyt
test_toolbox.py
*.xml

Toolbox.pyt parece:

import arcpy

from toolpackages.service_one import ServiceOne
from toolpackages.service_two import ServiceTwo

class Toolbox(object):
    def __init__(self):
        '''
        Define the toolbox properties here. Do not change the name of this
        class. ArcGIS locates this class by name. It will not be able to find
        the toolbox and your toolbox will not work if you modify this.
        '''
        self.label = 'Toolbox'
        self.alias = 'ABCD'

        # List of tool classes associated with this toolbox
        self.tools = [ServiceOne, ServiceTwo]

El directorio toolpackages contiene las definiciones de las herramientas, con el código real en el módulo de servicios.

He aquí un ejemplo de uno de los archivos de los paquetes de herramientas (sólo las primeras líneas):

import service.services as services_main
import arcpy_utils.toolbox_utils as utils

class ServiceOne(object):
    """
    Does Service One
    """
    def __init__(self):
        """
        Define the tool class attributes, including your tool parameters.
        """
        self.label = 'ServiceOne'
        self.canRunInBackground = False

0 votos

¿Cómo estás importando toolbox_utils desde service_one (o cualquiera de los otros paquetes)? Con la estructura dada arriba, tu directorio de nivel superior no es un paquete y no puede ser usado con importaciones relativas. Estaba tratando de recrear la situación que tienes aquí, pero me encontré con eso.

0 votos

Oops, debería ser arcpy_utils, no toolbox_utils.

0 votos

Editado para añadir otro ejemplo de código

1voto

Mintx Puntos 2627

Parece un conflicto de versiones de ArcGIS. ¿Están las cajas de herramientas en una carpeta a la que el ArcCatalog 10.3.1 puede acceder? ¿Tal vez usted necesita para "Conectar a la carpeta" en primer lugar?

Esta respuesta también tiene algunas sugerencias: Esri Python Toolbox(pyt) corrupción en ArcToolbox.dat

Puede intentar borrar el ArcToolbox.dat en ~\AppData\Roaming\ESRI\Desktop10.3\ArcToolbox

0 votos

Desde el tema vinculado, parece que la desactivación de la historia de los resultados de geoprocesamiento podría arreglar mi problema - Yo había comprobado o intentado todas las otras cosas (incluyendo la eliminación de la ArcToolbox.dat). Tomará un tiempo antes de que pueda comprobar, ya que me di por vencido y escribió Flask servicios en su lugar, pero incluso si eso lo arregla, ESRI tiene algunos errores para arreglar. Aceptado a menos que las pruebas demuestren lo contrario.

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