Había publicado una pregunta la semana pasada sobre la personalización de una clase de ToolValidator y obtuve algunas muy buenas respuestas. Al trabajar con las soluciones propuestas, he creado un módulo personalizado que realiza consultas en una base de datos, y será llamado por la clase ToolValidator (para proporcionar valores para las listas desplegables) y más tarde en el script de geoprocesamiento (para obtener otros parámetros basados en elementos seleccionados en listas desplegables). Sin embargo, parece que no puedo llamar al módulo personalizado en la clase ToolValidator. He estado tratando de unirme al camino sin suerte. Cuando intento aplicar estos cambios al script, aparece un error de tiempo de ejecución: [Errno 9] Descriptor de archivo incorrecto. Si comento una línea de importación, no hay errores.
sys.path.append('my_custom_module_directory')
import my_custom_module
Muchos de ustedes se preguntarán por qué no solo implemento una herramienta personalizada con ArcObjects. La razón es que mis usuarios finales no tienen los privilegios necesarios para registrar CUALQUIER dlls en su computadora.
ACTUALIZACIÓN: Esto me estaba sucediendo en ArcGIS 10. Curiosamente, inicialmente estaba agregando a la ruta dentro de la función initialiazeParameters de la clase ToolValidator. Si anexo fuera (es decir, encima) de la clase ToolValidator, todo funciona como se esperaba.
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()
ACTUALIZACIÓN 2: Creo que encontré la verdadera causa de mi problema. En los fragmentos de código de esta publicación, he estado agregando lo que parecen ser rutas reales (por ejemplo, C: / Working / SomeFolder) al sys.path. En mi clase real de ToolValidator, estaba construyendo una ruta relativa usando os.path.dirname(__file__)
+ "\ my_special_folder ...". Estaba anticipando que os.path.dirname(__file__)
devolvería la ruta de la caja de herramientas, ya que contiene la clase ToolValidator. He llegado a encontrar que este no es el caso. Por lo que puedo decir, la clase ToolValidator nunca se escribe realmente en un archivo .py, y especulo que este código se pasa al intérprete de Python en la memoria, por lo que __file__
es inútil, o se conserva algún script temporal y luego execfile ( path_to_script) se llama, nuevamente renderizando__file__
inútil. Estoy seguro de que también faltan otras razones.
Para resumir, si uso una ruta codificada, sys.append funciona en cualquier lugar, las rutas relativas no funcionan tan bien en la clase ToolValidator.