На прошлой неделе я опубликовал вопрос о настройке класса ToolValidator и получил несколько очень хороших ответов. Работая с предлагаемыми решениями, я создал пользовательский модуль, который выполняет запросы к базе данных, и будет вызываться как классом ToolValidator (для предоставления значений для раскрывающихся списков), так и позже в сценарии геообработки (чтобы получить другие параметры на основе элементов, выбранных в раскрывающихся списках). Однако я не могу вызвать пользовательский модуль в классе ToolValidator. Я пытался присоединиться к пути без удачи. Когда я пытаюсь применить эти изменения к сценарию, я получаю сообщение об ошибке во время выполнения: [Errno 9] Неверный дескриптор файла. Если я закомментирую строку импорта, ошибок нет.
sys.path.append('my_custom_module_directory')
import my_custom_module
Многие из вас могут спросить, почему бы мне не реализовать собственный инструмент с ArcObjects. Причина в том, что мои конечные пользователи не имеют прав, необходимых для регистрации ЛЮБЫХ библиотек на своем компьютере.
ОБНОВЛЕНИЕ: Это происходило со мной в ArcGIS 10. Интересно, что я изначально добавлял путь в функцию initialiazeParameters класса ToolValidator. Если я добавлю за пределы (т.е. поверх) класса ToolValidator, все будет работать так, как ожидается.
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()
ОБНОВЛЕНИЕ 2: я думаю, что нашел истинную причину своей проблемы. В фрагментах кода в этом посте я добавляю реальные пути (например, C: / Working / SomeFolder) к sys.path. В моем собственном классе ToolValidator я строил относительный путь, используя os.path.dirname(__file__)
+ "\ my_special_folder ...". Я ожидал, что os.path.dirname(__file__)
это вернет путь к набору инструментов, так как он содержит класс ToolValidator. Я пришел к выводу, что это не тот случай. Насколько я могу судить, класс ToolValidator фактически никогда не записывается в файл .py, и я предполагаю, что этот код передается интерпретатору python в памяти, поэтому __file__
он бесполезен, или какой-то временный скрипт сохраняется и затем выполняется execfile ( path_to_script) вызывается, снова рендеринг__file__
бесполезный. Я уверен, что есть и другие причины, по которым я скучаю.
Короче говоря, если я использую жестко закодированный путь, sys.append работает где угодно, относительные пути не так хорошо работают в классе ToolValidator.