Pautas para organizar Python Toolboxes (.pyt) en ArcGIS

17

Para una de mis tareas, necesito crear una caja de herramientas con tres herramientas (secuencias de comandos de Python).

En lugar de tbx ordinario, he decidido escribirlo como Python Toolbox (pyt).

Todo está claro, excepto la "buena" forma de organizar el código.

Como tengo tres herramientas, no es una buena manera de almacenarlas en un archivo (pyt). Entonces, decidí mantener cada herramienta en un archivo .py separado.

Aquí hay un problema: ¿cuál es la buena manera de organizar varios archivos con PYT para su distribución o implementación en ArcGIS for Server? ¿Debería mantenerlos al mismo nivel que el archivo PYT o debería colocarlos en algún subdirectorio (es decir, "Herramientas")?

¿Me puede recomendar alguna guía de Esri o una muestra de referencia de "caja de herramientas PYT grande"?

No he encontrado nada sobre este tema. En la versión 10.0 había la llamada estructura de carpetas ToolShare que he usado.

Esto es más una cuestión de estilo de codificación. Porque la idea de crear un archivo PYT con 500-1000 o más líneas de código no me parece bien y creo que no es una forma "pitónica".

Alex Markov
fuente
1
"La idea de crear un archivo PYT con 500-1000 o más líneas de código no me parece bien". No estás solo, Alex. Hoy dije rápidamente que .pyt es un invento de la mente enferma. Y no me arrepentiré.
Remigijus Pankevičius

Respuestas:

17

Echa un vistazo a este hilo en el foro de ArcGIS. Básicamente, solo use módulos estándar de Python o una estructura de paquete e importe sus herramientas a la caja de herramientas de Python.

Algo como:

#  \--SomeDir
#     |  toolbox.pyt
#     \--toolpackage
#        |  __init__.py
#        |  script_a.py
#        |  script_b.py


#----------------------------
#The .pyt file
#----------------------------

import arcpy
import toolpackage.script_a.Tool1 as Tool1
import toolpackage.script_a.Tool2 as Tool2
import toolpackage.script_b.Tool3 as Tool3

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

        # List of tool classes associated with this toolbox
        self.tools = [Tool1, Tool2, Tool3]
usuario2856
fuente
Descubrí que esto funciona bien en ArcGIS Desktop, pero al publicar un servicio de geoprocesamiento en una instancia de ArcGIS Server, pierde todos los scripts y paquetes, excepto el archivo .pyt. Puede ser posible colocar los scripts en la implementación manualmente, pero eso aumenta la complejidad.
Gnat
3
@Gnat Sí, los pensamientos de Luke también son mi experiencia. Los servicios de publicación de ESRI no reconocen ninguna de las from x import yimportaciones de estilo. (Eso es completamente ridículo, por cierto.) Sin embargo, creo que puedes dejar tu self.toolsdefinición sola y usarla import toolpackage.script_a.Tool1 as Tool1.
jpmc26
1
El alias debe ser corto y solo contener letras, es decir, self.alias = "mtt"
Curtis Price
2
Como acabo de pasar una hora haciendo cambios en mi código de herramientas y tratando de que se refleje en la interfaz gráfica de la herramienta en Arcmap, me gustaría compartir esto. Si realiza cambios en su código fuera del archivo pyt y desea verlo reflejado en la interfaz gráfica de la herramienta, debe reiniciar ArcMap / Catalog. Puede presionar actualizar en la caja de herramientas todo lo que quiera, eso solo parece recargar el pyt. No encontrará los cambios en el otro código.
TurboGus
1
@TurboGus gis.stackexchange.com/q/91112/2856
user2856