¿Actualizando módulos importados en ArcGIS Python Toolbox?

15

Al usar una caja de herramientas de python (.pyt) en ArcMap, normalmente seguiré un patrón donde el archivo .pyt en sí mismo es simplemente un contenedor para recopilar argumentos de entrada y definir las herramientas en sí. El código de soporte se guarda en módulos independientes que se pueden probar por unidad.

Ejemplo:

import supporting_module

class MyTool(object):

    ...

    def execute(self, parameters, messages):
        """The source code of the tool."""
        some_input = parameters[0].valueAsText
        some_output = parameters[1].valueAsText

        supporting_module.do_something(some_input, some_output)
        arcpy.SetParameter(2, some_output)

Esto funciona muy bien, pero me he encontrado con un problema frustrante durante el desarrollo. Haz clic derecho - > Actualizar en .pyt en ArcMap solo actualiza el código del archivo .pyt. No actualiza los módulos importados, así que tengo que cerrar y volver a abrir ArcMap cada vez que cambio algo allí. Afortunadamente, ya que estoy probando el código de forma independiente, no tengo que hacer esto una tonelada, pero sigue siendo un problema importante. ¿Hay alguna manera de evitar esto? Algo relacionado: ¿hay alguna forma de actualizar completamente la consola de Python (tengo un paquete de sitio personalizado que también debo cerrar / volver a abrir ArcMap para extraer los cambios también)?

Estoy usando ArcMap 10.2.1.

    
pregunta Josh Werts 27.03.2014 - 15:21

2 respuestas

14

Encontré esta posibilidad, enlace

La única advertencia es que si tiene alguna variable asignada al módulo, será necesario asignarla nuevamente.

Pero como lo tienes escrito anteriormente, puedes hacer esto:

import supporting_module
def execute()
  reload(supporting_module)
  ...

De esta manera, cada vez que ejecute la herramienta, se asegurará de tener el módulo actualizado. Una vez que se realiza el desarrollo, se puede eliminar.

    
respondido por el cndnflyr 27.03.2014 - 18:58
5

Aquí hay una manera diferente y más robusta de lo que sugerí anteriormente.

No he usado este módulo, pero creo que resolvería tu problema:

Reloader del módulo de Python

  

Esta biblioteca implementa un reloader de módulo basado en dependencias para Python.   A diferencia de la función incorporada reload (), este reloader recargará el   Módulo solicitado y todos los demás módulos que dependen de ese   módulo.

Dado el ejemplo anterior, esto debería cargar todas las dependencias con una llamada:

import reloader
reloader.enable()

import supporting_module

def execute()
  reloader.reload(supporting_module)
  ...

Esta es la primera vez que me doy cuenta de este módulo, así que si lo implementas en tus herramientas, comenta lo bien que funciona para ti.

    
respondido por el cndnflyr 27.03.2014 - 21:24

Lea otras preguntas en las etiquetas