Depurando AttributeError: o objeto 'module' não tem atributo 'Parameter' no Python Toolbox of ArcPy?

8

Eu tenho um grande script .pyt (python toolbox) e agora estou tentando dividi-lo em muitos arquivos (1 arquivo - 1 ferramenta).

No único arquivo .pyt tudo funciona perfeitamente, mas quando o arquivo é dividido, recebo a seguinte mensagem: AttributeError: o objeto 'module' não tem atributo 'Parameter'.

Estrutura dos arquivos:

My Catalog:
-- toolbox.pyt
-- toolpackage:
---- configurator.py
---- __init__.py

toolbox.pyt:

# This Python file uses the following encoding: utf-8

import arcpy

from toolpackage.configurator import ToolboxConfigurator

class Toolbox(object):
  def __init__(self):
    """Define the toolbox (the name of the toolbox is the name of the .pyt file)."""
    self.label = "label"
    self.alias = "Tools"

    # List of tool classes associated with this toolbox
    self.tools = [ToolboxConfigurator]

configurator.py:

# This Python file uses the following encoding: utf-8

import arcpy

class ToolboxConfigurator(object):

  def __init__(self):
    """Define the tool (tool name is the name of the class)."""
    self.label              = u"config"
    self.description        = u""
    self.canRunInBackground = False

  def getParameterInfo(self):
    """Define parameter definitions"""
    new_config_file   = arcpy.Parameter(
      displayName     = u"?",
      name            = "new_config_file",
      datatype        = "GPBoolean",
      parameterType   = "Optional",
      direction       = "Input")
    parameters = [new_config_file]
    return parameters

  def isLicensed(self):
    """Set whether tool is licensed to execute."""
    return True

  def updateParameters(self, parameters):
    """Modify the values and properties of parameters before internal validation
    is performed.  This method is called whenever a parameter has been changed."""
    return

  def updateMessages(self, parameters):
    """Modify the messages created by internal validation for each tool
    parameter.  This method is called after internal validation."""
    return

  def execute(self, parameters, messages):
    """The source code of the tool."""

__init__.py está claro.

Meu erro:

Traceback (most recent call last):
  File "C:\tools_v4\toolpackage\configurator.py", line 15, in getParameterInfo
    new_config_file   = arcpy.Parameter(
AttributeError: 'module' object has no attribute 'Parameter'
Vladimir Ivanov
fonte
Eu segui sua estrutura exatamente e funciona para mim.
DWynne
2 DWynne, qual é a versão do seu software?
Vladimir Ivanov
Estou na versão 10.3 (mas eu poderia verificar uma versão diferente com bastante facilidade). Qual versão você está usando?
DWynne
1
Correndo para o mesmo problema com o ArcGIS 10.3.1 Corrigido, excluindo todos os arquivos XML criados pelo ArcGIS na pasta da caixa de ferramentas, reiniciei o ArcGIS e execute novamente a ferramenta (não forme a janela de resultados, mas clicando nela). Ainda parece ser meio aleatório.
Thomas Thomas
1
Estou vendo muito isso na versão 10.3.1, em serviços arquivados de arquivos múltiplos que estavam funcionando bem. Retirei versões anteriores do git que funcionavam perfeitamente, limpei o diretório, limpei os serviços e ainda estou tendo problemas estranhamente aleatórios.
CMPalmer

Respostas:

10

Isso pode não ser a causa de todos, mas identifiquei pelo menos um conjunto de gatilhos.

  1. Execute a ferramenta de caixa de ferramentas Python do ArcCatalog
  2. O histórico de geoprocessamento está ativado e inclui um resultado do nº 1.
  3. Ao iniciar uma nova sessão do ArcCatalog, nenhuma janela de geoprocessamento é aberta inicialmente (como a janela ArcToolbox, a janela Python, a janela Resultados).

Se tudo isso for verdade, a ferramenta Python toolbox mostrará a AttributeError: 'module' object has no attribute 'Parameter'exceção.

Limpar o histórico (ou não registrá-lo) evitará o problema, provavelmente por que eu não vi isso antes, pois raramente guardo meu histórico.

Clicar com o botão direito do mouse na caixa de ferramentas e usar a atualização limpará o erro, mas ele será exibido novamente no futuro enquanto a lista acima permanecer verdadeira. No entanto, se a ferramenta estiver importando a classe de ferramenta de um arquivo de ferramenta separado (como no caso acima), uma atualização não será suficiente. Para isso, precisei forçar a inclusão de um reloadno .pyt e, em seguida, uma atualização na caixa de ferramentas limpará o erro.

# Using example of toolbox.pyt above
import toolpackage.configurator  # add import
reload(toolpackage.configurator)  # add a forced reload
from toolpackage.configurator import ToolboxConfigurator
DWynne
fonte
Aparentemente, esse bug ainda existe às 10.6 - estava me deixando louco; renomear o pyt pareceu corrigi-lo (temporariamente). O uso do reload não apenas o corrigiu, mas agora posso usar a atualização para evitar ter que sair e reiniciar o ArcCatalog constantemente ao desenvolver o código, OBRIGADO!
brian h wilson