Ricompilare il componente aggiuntivo Python dopo aver modificato lo script?


15

Ho sviluppato alcuni componenti aggiuntivi di Python e mi chiedo quale sia il modo migliore per ricompilare il componente aggiuntivo ogni volta che modifico lo script.

Attualmente, se apporto una modifica allo script, sembra che debba farlo

  1. Chiudi ArcMap
  2. Vai alla cartella Il mio componente aggiuntivo e fai doppio clic sul file python 'makeaddin'
  3. Fare doppio clic sul 'File aggiuntivo Python
  4. Riavvia ArcMap per rendere effettive le modifiche

Se non eseguo questi passaggi, le modifiche non vengono riconosciute. Questo diventa piuttosto fastidioso e richiede tempo quando voglio posizionare forse una semplice linea di stampa da qualche parte o faccio una piccola modifica solo per testare un risultato.

C'è un modo migliore per farlo?

Risposte:


11

Puoi usare la reloadfunzione integrata in Python per ricaricare automaticamente il tuo modulo. Quello che puoi fare è qualcosa del genere:

import mymodule

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

dove hook()si chiama ArcMap ed mymoduleè il modulo che stai modificando tra le chiamate. Potrebbe essere necessario modificare sys.pathper includere il percorso del modulo che stai modificando in modo che import mymodulenon fallisca. Oppure includi la directory in site-packages(magari usando python setup.py develop).


1
Naturalmente questo sarebbe utile solo durante lo sviluppo; Credo che i progettisti di ArcGIS intendano testare la tua sceneggiatura prima di creare il componente aggiuntivo ( resources.arcgis.com/en/help/main/10.1/index.html#/… )
cwa,

Questo è anche quello che faccio. Uso anche winpdb per il debug incorporato.
blah238,

Grazie per il suggerimento Questo è un po 'oltre il mio set di abilità. È difficile da implementare? Ci sono ulteriori informazioni su questo che posso usare per imparare?
Mike,

1
Sono uno sviluppatore Python con un'esperienza ArcGIS limitata, ma lo sto imparando. Aggiornerò con maggiori dettagli dopo averli capiti.
cwa,

@ blah238 come hai configurato il debug incorporato? Il mio componente aggiuntivo si connetterà ma interromperà la connessione dopo il caricamento.
ShaunLangley,

8

Per il suggerimento di @ blah238, il seguente script

  1. chiude ArcMap (se aperto)
  2. crea un componente aggiuntivo
  3. installa il componente aggiuntivo in silenzio
  4. riapre il documento ArcMap

Salvare nella directory contenente 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)

è incluso nel tuo file PythonTool_addin.py?
ShaunLangley,

@ShaunLangley, no, questo è un file .py separato che risiede nella directory di makeaddin.py
Paul,

Ottima sceneggiatura. Tuttavia, come previsto, ArcMap cade quando lo script tenta di aprire il file .mxd all'esterno di ArcMap. C'è una soluzione nota a questo?
TheLastGIS,

1
@TheLastGIS Sì. Aggiungi le variabili arcmap = "C:/Program Files (x86)/ArcGIS/Desktop10.3/bin/ArcMap.exe"e Map = '"{0}" {1} /s'.format(arcmap, mapdoc)quanto sopra. Quindi os.system(Map)ci riuscirà dove os.system(mapdoc)no.
alphabetasoup,

2

Ho ricevuto una risposta sul sito Web ArcGIS. Apparentemente questo è l'unico modo per ricompilare i componenti aggiuntivi di Python. Qualcuno ha registrato un'idea su ArcGIS Ideas e anch'io ho votato e commentato.

Il thread del forum di discussione di ArcGIS si trova qui .


1
Potresti aggiungere i collegamenti pertinenti alla tua risposta?
blah238,

Volevo votare, ma non sono riuscito a trovare l'idea ArcGIS citata da @Mike.
PolyGeo

Mi dispiace, non ho visto questa risposta fino ad ora. Grazie a @PolyGeo per l'aggiornamento del collegamento al sito Web ArcGIS.
Mike,

1

In genere uso due approcci: uno è, per tutti gli strumenti che usi che sono in realtà solo geoprocessing, consentono loro di essere importati, quindi puoi impostare una sessione interattiva di Python e fare reload(mymodule)come indicato per includere le ultime modifiche (o impostare caricamento automatico in IPython ). Se stai solo apportando modifiche a una casella degli strumenti di Python, puoi ricaricare la casella degli strumenti facendo clic destro su di essa nella vista Catalogo e facendo clic su "Aggiorna".

Per il codice che richiede l'interazione dell'utente nella GUI, utilizzo il seguente script batch per accelerare il processo:

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

Dove myaddin.mxd ha livelli di dati e contesto che utilizzo per il progetto specifico. Questo attiverà l'installazione del componente aggiuntivo e ArcMap contemporaneamente, ma di solito posso fare clic sul pulsante 'Installa componente aggiuntivo' più velocemente di quanto ArcGIS avvii. In alternativa, è possibile aggiungere pauseprima dell'ultimo comando per attendere l'input prima di avviare ArcGIS.


1
È possibile utilizzare ESRIRegAddIn.execon l' /sinterruttore per installare il componente aggiuntivo in modo invisibile all'utente. Il percorso di ESRIRegAddIn sul mio computer è C:\Program Files (x86)\Common Files\ArcGIS\bin.
blah238,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.