¿Re-compilación de Python Addin después de editar el script?

15

He estado desarrollando algunos complementos de Python y me pregunto cuál es la mejor manera de volver a compilar el complemento cada vez que edito el script.

Actualmente, si hago una edición en el script, parece que tengo que

  1. Cerrar ArcMap
  2. Vaya a Mi carpeta de complementos y haga doble clic en el archivo 'makeaddin' de python
  3. Haga doble clic en 'Archivo de complemento de Python
  4. Reinicie ArcMap para que los cambios entren en vigencia

Si no sigo estos pasos, no se reconocen las ediciones. Esto se vuelve bastante molesto y requiere mucho tiempo cuando quiero colocar tal vez una línea de impresión simple en algún lugar o hago una pequeña edición solo para probar un resultado.

¿Hay una mejor manera de hacer esto?

Miguel
fuente

Respuestas:

11

Puede usar la reloadfunción incorporada en python para recargar automáticamente su módulo. Lo que puedes hacer es algo como esto:

import mymodule

def hook():
    reload(mymodule)
    mymodule.myfunction()

dónde hook()está lo que ArcMap llama y mymodulees el módulo que está editando entre invocaciones. Puede que tenga que editar sys.pathpara incluir la ruta del módulo que está editando para que import mymoduleno falle. O incluya el directorio en site-packages(tal vez usando python setup.py develop).

cwa
fuente
1
Por supuesto, esto solo sería útil durante el desarrollo; Creo que los diseñadores de ArcGIS tienen la intención de que pruebe su script antes de crear el complemento ( resources.arcgis.com/en/help/main/10.1/index.html#/… )
cwa
Esto es lo que hago también. También uso winpdb para depuración incrustada.
blah238
Gracias por la sugerencia. Esto está un poco más allá de mi conjunto de habilidades. ¿Es difícil de implementar? ¿Hay más información sobre esto que pueda usar para aprender?
Mike
1
Soy un desarrollador de Python con experiencia limitada en ArcGIS, pero lo estoy aprendiendo. Actualizaré con más detalles después de resolverlos.
cwa
@ blah238 ¿cómo configuró la depuración incrustada? Mi complemento se conectará, pero la conexión se cae después de cargarse.
ShaunLangley
8

Según la sugerencia de @ blah238, el siguiente script

  1. cierra ArcMap (si está abierto)
  2. crea un complemento
  3. instala el complemento silenciosamente
  4. vuelve a abrir el documento de ArcMap

Guardar en el directorio que contiene makeaddin.py:

import os

#Location of ESRIRegAddIn.exe
esri = "C:/Program Files (x86)/Common Files/ArcGIS/bin/ESRIRegAddIn.exe"
cwd = os.getcwd()
mapdoc = <path to mxd>

#Close ArcMap if it is open
try:    os.system("TASKKILL /F /IM ArcMap.exe")
except:    pass

#Create ESRI Add-in file
os.system(os.path.join(cwd, "makeaddin.py"))

#Silently install Add-in file. The name of the file is based on folder it's located in.
os.system('"{0}" {1} /s'.format(esri, os.path.split(cwd)[-1] + ".esriaddin"))

#Open test map document.
os.system(mapdoc)
Pablo
fuente
¿Está esto incluido en su archivo PythonTool_addin.py?
ShaunLangley
@ShaunLangley, no, este es un archivo .py separado que reside en el directorio de makeaddin.py
Paul
Gran guion. Sin embargo, como se esperaba, ArcMap se cae cuando el script intenta abrir el archivo .mxd fuera de ArcMap. ¿Hay alguna solución conocida para esto?
TheLastGIS
1
@TheLastGIS Sí. Agregue las variables arcmap = "C:/Program Files (x86)/ArcGIS/Desktop10.3/bin/ArcMap.exe"y Map = '"{0}" {1} /s'.format(arcmap, mapdoc)a lo anterior. Entonces os.system(Map)tendrá éxito donde os.system(mapdoc)no.
alphabetasoup
2

Recibí una respuesta en el sitio web de ArcGIS. Aparentemente, esta es la única forma de volver a compilar complementos de Python. Alguien ha registrado una idea en ArcGIS Ideas y también he votado y comentado.

El hilo del foro de discusión de ArcGIS se encuentra aquí .

Miguel
fuente
1
¿Podría agregar los enlaces relevantes a su respuesta?
blah238
Quería votar pero no pude encontrar la idea de ArcGIS que @Mike menciona.
PolyGeo
Lo siento, no vi esta respuesta hasta ahora. Gracias @PolyGeo por actualizar el enlace al sitio web de ArcGIS.
Mike
1

Generalmente uso dos enfoques: uno es, para cualquier herramienta que use que realmente sea solo geoprocesamiento, permita que se importen, y luego puede configurar una sesión interactiva de Python, y hacer reload(mymodule)lo mencionado para incluir los cambios más nuevos (o configurar recarga automática en IPython ). Si solo está realizando cambios en una caja de herramientas de Python, puede volver a cargar la caja de herramientas haciendo clic derecho sobre ella en la vista Catálogo y haciendo clic en 'Actualizar'.

Para el código que requiere la interacción del usuario en la GUI, utilizo el siguiente script por lotes para acelerar el proceso:

@echo off
echo building...
python makeaddin.py
echo installing...
start myaddin.esriaddin
echo load ArcMap...
start %HOMEDRIVE%%HOMEPATH%\Documents\ArcGIS\myaddin.mxd

Donde myaddin.mxd tiene capas de datos y contexto que uso para el proyecto específico. Esto activará la instalación del complemento y ArcMap simultáneamente, pero generalmente puedo hacer clic en el botón 'Instalar complemento' más rápido de lo que comienza ArcGIS. Alternativamente, puede agregar pauseantes del último comando para esperar la entrada antes de iniciar ArcGIS.

scw
fuente
1
Puede usar ESRIRegAddIn.exeel /sinterruptor para instalar el complemento de forma silenciosa. La ruta a ESRIRegAddIn en mi máquina es C:\Program Files (x86)\Common Files\ArcGIS\bin.
blah238