Aggiornamento dei moduli importati in ArcGIS Python Toolbox?


15

Quando utilizzo una toolbox python (.pyt) in ArcMap, seguirò generalmente un modello in cui il file .pyt stesso è semplicemente un wrapper per raccogliere argomenti di input e definire gli strumenti stessi. Il codice di supporto viene conservato in moduli separati testabili dall'unità.

Esempio:

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)

Questo funziona davvero bene, ma ho riscontrato un problema frustrante durante lo sviluppo. Fare clic con il tasto destro del mouse -> Aggiorna su .pyt in ArcMap aggiorna solo il codice del file .pyt. Non aggiorna i moduli importati, quindi devo chiudere e riaprire ArcMap ogni volta che cambio qualcosa lì. Fortunatamente, dal momento che sto testando il codice in modo indipendente, non devo farlo un sacco, ma è ancora una seccatura maggiore. C'è un modo per aggirare questo? In qualche modo correlato - c'è un modo per aggiornare completamente la console Python (ho un pacchetto del sito personalizzato che devo anche chiudere / riaprire ArcMap per estrarre anche le modifiche)?

Sto usando ArcMap 10.2.1.

Risposte:


14

Ho trovato questa possibilità, /programming/1517038/python-refresh-reload

L'unica avvertenza è che se si hanno variabili assegnate al modulo, sarà necessario assegnarle nuovamente.

Ma come hai scritto sopra, potresti farlo:

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

In questo modo ogni volta che esegui lo strumento avrai sicuramente il modulo aggiornato. Una volta fatto lo sviluppo, questo può essere eliminato.


1
Estremamente utile e questo risolve il semplice esempio che ho pubblicato. Tuttavia, se support_module importa anche altri moduli helper, dovrebbero essere chiamati anche con ricaricamento. Sto pensando che questo sia il migliore che avremo in quanto ha senso con il modo in cui Python carica i moduli: segnerò il tuo come risposta se qualcosa di più robusto non accadrà nel giorno successivo.
Josh Werts,

Molto utile. Ho scoperto che è sufficiente chiamare reload()subito dopo aver importato il modulo di supporto, nella parte superiore del file PYT della casella degli strumenti. Pertanto, se la casella degli strumenti contiene diversi strumenti, non devo duplicare la ricarica nella funzione di ciascuno strumento execute().
Mike Finch,

Non capisco davvero come questa risposta risolva il problema. Ho i miei strumenti memorizzati in file .py e li importa usando from pyfile import Tool, aggiungendo reload(tool)resi typeError: reload() argument must be module. Qualche idea?
Ratnanil,

2
Ho trovato la soluzione! importare prima il file py come modulo, ricaricare e quindi importare la classe all'interno del modulo. Vedi: stackoverflow.com/a/6946467/4139249
Ratnanil

5

Ecco un modo diverso e più robusto di quello che ho suggerito prima.

Non ho usato questo modulo da solo, ma penso che risolverebbe il tuo problema:

Python Module Reloader

Questa libreria implementa un modulo ricaricabile basato su dipendenze per Python. A differenza della funzione built-in reload (), questo reloader ricaricherà il modulo richiesto e tutti gli altri moduli che dipendono da quel modulo.

Dato l'esempio precedente, questo dovrebbe caricare tutte le dipendenze con una chiamata:

import reloader
reloader.enable()

import supporting_module

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

Questa è la prima volta che ho notato questo modulo, quindi se lo implementi nei tuoi strumenti, commenta quanto bene funziona per te.


Buona scoperta! Questo ha funzionato se aggiunto esattamente come mostrato. Devo solo fare clic con il tasto destro -> aggiorna sulla casella degli strumenti se il file .pyt stesso cambia. I moduli di supporto e i relativi moduli secondari vengono ricaricati correttamente. Un avvertimento però: a volte ho ricevuto un paio di eccezioni inspiegabili e un crash di ArcMap (anche se i crash di ArcMap in realtà non sono così anormali, sfortunatamente). Nota: l'ho provato solo con il modulo di supporto e un sottomodulo dipendente. Potrebbe riferire sulla stabilità in futuro.
Josh Werts,

1
Super, grazie per aver segnalato. Sì, quando guido ArcMap, a volte mi sento come un manichino da crash test.
cndnflyr,

Sfortunatamente, ho riscontrato troppi problemi di stabilità con questo reloader, quindi ho cambiato la risposta selezionata alla funzione integrata originale reload (). A volte è più semplice è meglio!
Josh Werts,
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.