La settimana scorsa avevo pubblicato una domanda sulla personalizzazione di una classe ToolValidator e ho ottenuto delle ottime risposte. Nel lavorare con le soluzioni proposte, ho creato un modulo personalizzato che esegue query su un db e verrà chiamato sia dalla classe ToolValidator (per fornire i valori per gli elenchi a discesa) sia successivamente nello script di geoprocessing (per ottenere altri parametri basati sugli elementi selezionati negli elenchi a discesa). Tuttavia, non riesco a chiamare il modulo personalizzato nella classe ToolValidator. Ho provato ad aggiungere al percorso senza fortuna. Quando provo ad applicare queste modifiche allo script, ottengo un errore di runtime: [Errno 9] Descrittore di file errato. Se commento la riga di importazione, nessun errore.
sys.path.append('my_custom_module_directory')
import my_custom_module
Molti di voi potrebbero chiedersi perché non devo implementare uno strumento personalizzato con ArcObjects. Il motivo è che i miei utenti finali non hanno i privilegi necessari per registrare QUALSIASI DLL sul proprio computer.
AGGIORNAMENTO: Mi stava succedendo in ArcGIS 10. È interessante notare che inizialmente stavo aggiungendo il percorso all'interno della funzione initialiazeParameters della classe ToolValidator. Se faccio l'appendice all'esterno (cioè sopra) della classe ToolValidator, tutto funziona come previsto.
sys.path.append('C:/Working/SomeFolder')
import somescript -------->THIS WORKS
class ToolValidator:
"""Class for validating a tool's parameter values and controlling
the behavior of the tool's dialog."""
def __init__(self):
"""Setup arcpy and the list of tool parameters."""
import arcpy
sys.path.append('C:/Working/SomeFolder')
import somescript -------> THIS DOESNT WORK
self.params = arcpy.GetParameterInfo()
AGGIORNAMENTO 2: Penso di aver trovato la vera causa del mio problema. Negli snippet di codice in questo post, ho aggiunto quelli che sembrano essere percorsi reali (ex C: / Working / SomeFolder) al sys.path. Nella mia attuale classe ToolValidator, stavo costruendo un percorso relativo usando os.path.dirname(__file__)+ "\ my_special_folder ...". Stavo anticipando che os.path.dirname(__file__)avrebbe restituito il percorso della casella degli strumenti, poiché contiene la classe ToolValidator. Sono venuto a scoprire che non è così. Per quanto ne so, la classe ToolValidator non viene mai effettivamente scritta in un file .py e suppongo che il codice this sia passato all'interprete python in memoria, quindi __file__è inutile, oppure alcuni script temporanei sono persistenti e quindi eseguono ( path_to_script) viene chiamato, di nuovo rendering__file__inutili. Sono sicuro che ci sono anche altri motivi per cui mi manca.
Per farla breve, se uso un percorso hardcoded, sys.append funziona ovunque, i percorsi relativi non funzionano così bene nella classe ToolValidator.
