La semaine dernière, j'avais posé une question sur la personnalisation d'une classe ToolValidator et obtenu de très bonnes réponses. En travaillant avec les solutions proposées, j'ai créé un module personnalisé qui effectue des requêtes sur une base de données, et sera appelé à la fois par la classe ToolValidator (pour fournir des valeurs pour les listes déroulantes) et plus tard dans le script de géotraitement (pour obtenir d'autres paramètres basés sur les éléments sélectionnés dans les listes déroulantes). Cependant, je n'arrive pas à appeler le module personnalisé dans la classe ToolValidator. J'ai essayé d'ajouter au chemin sans succès. Lorsque j'essaie d'appliquer ces modifications au script, j'obtiens une erreur d'exécution: [Errno 9] Mauvais descripteur de fichier. Si je commente la ligne d'importation, aucune erreur.
sys.path.append('my_custom_module_directory')
import my_custom_module
Beaucoup d'entre vous se demandent peut-être pourquoi je n'implémente pas simplement un outil personnalisé avec ArcObjects. La raison en est que mes utilisateurs finaux ne disposent pas des privilèges nécessaires pour enregistrer des DLL sur leur ordinateur.
MISE À JOUR: Cela m'arrivait dans ArcGIS 10. Assez intéressant, j'étais initialement en train d'ajouter au chemin à l'intérieur de la fonction initialiazeParameters de la classe ToolValidator. Si je fais l'ajout à l'extérieur (c'est-à-dire au-dessus) de la classe ToolValidator, tout fonctionne comme prévu.
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()
MISE À JOUR 2: Je pense avoir trouvé la véritable cause de mon problème. Dans les extraits de code de cet article, j'ai ajouté ce qui semble être de vrais chemins (ex C: / Working / SomeFolder) au sys.path. Dans ma classe ToolValidator actuelle, je construisais un chemin relatif en utilisant os.path.dirname(__file__)
+ "\ my_special_folder ...". os.path.dirname(__file__)
J'anticipais que cela retournerait le chemin de la boîte à outils, car il contient la classe ToolValidator. Je suis venu pour constater que ce n'est pas le cas. Pour autant que je sache, la classe ToolValidator n'est jamais réellement écrite dans un fichier .py, et je spécule que le code est transmis à l'interpréteur python en mémoire, donc __file__
inutile, ou qu'un script temporaire est persistant, puis execfile ( path_to_script) est appelé, rendant à nouveau__file__
inutile. Je suis sûr qu'il y a d'autres raisons qui me manquent également.
Pour faire court, si j'utilise un chemin codé en dur, sys.append fonctionne n'importe où, les chemins relatifs ne fonctionnent pas si bien dans la classe ToolValidator.