Обновление импортированных модулей в ArcGIS Python Toolbox?

15

При использовании набора инструментов Python (.pyt) в ArcMap я обычно буду следовать шаблону, в котором сам файл .pyt является просто оболочкой для сбора входных аргументов и определения самих инструментов. Вспомогательный код хранится в отдельных модульно-тестируемых модулях.

Пример:

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)

Это работает очень хорошо, но я столкнулся с одной неприятной проблемой во время разработки. Щелкните правой кнопкой мыши -> Обновить .pyt в ArcMap только обновляет код файла .pyt. Он не обновляет импортированные модули, поэтому мне приходится закрывать и снова открывать ArcMap всякий раз, когда я что-то там меняю. К счастью, так как я тестирую код самостоятельно, мне не нужно делать это тонну, но это все еще большая проблема. Есть ли способ обойти это? Несколько связано - есть ли способ полностью обновить консоль Python (у меня есть собственный пакет сайта, который я также должен закрыть / снова открыть ArcMap для получения изменений)?

Я использую ArcMap 10.2.1.

Джош Вертс
источник

Ответы:

14

Я нашел такую ​​возможность, /programming/1517038/python-refresh-reload

Единственное предостережение: если у вас есть какие-либо переменные, назначенные модулю, их нужно будет назначить снова.

Но, как вы написали выше, вы можете сделать это:

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

Таким образом, при каждом запуске инструмента вы будете иметь обновленный модуль. Как только разработка завершена, ее можно убрать.

cndnflyr
источник
1
Чрезвычайно полезно, и это решает простой пример, который я разместил. Однако, если support_module также импортирует другие вспомогательные модули, то их также нужно вызывать с перезагрузкой. Я думаю, что это лучшее, что мы получим, поскольку это имеет смысл с тем, как Python загружает модули - я отмечу ваш ответ как ответ, если что-то более надежное не появится на следующий день или около того.
Джош Вертс
Очень полезно. Я обнаружил, что достаточно позвонить reload()сразу после импорта модуля поддержки, в верхней части PYT-файла панели инструментов. Таким образом, если набор инструментов содержит несколько инструментов, мне не нужно дублировать перезагрузку в каждой execute()функции инструмента .
Майк Финч
Я не очень понимаю, как этот ответ решает проблему. У меня есть мои инструменты хранятся в .py файлов и импортировать их с помощью from pyfile import Tool, добавив reload(tool)возвращается typeError: reload() argument must be module. Есть идеи?
Ратнанил
2
Я нашел решение! сначала импортируйте py-File как модуль, перезагрузите, а затем импортируйте класс в модуле. См .: stackoverflow.com/a/6946467/4139249
Ратнанил
5

Вот другой и более надежный способ, чем я предлагал ранее.

Я не использовал этот модуль сам, но думаю, что он решит вашу проблему:

Модуль Python Reloader

Эта библиотека реализует модуль перезарядки на основе зависимостей для Python. В отличие от встроенной функции reload (), этот перегрузчик перезагрузит запрошенный модуль и все другие модули, которые зависят от этого модуля.

Учитывая предыдущий пример, это должно загрузить все зависимости одним вызовом:

import reloader
reloader.enable()

import supporting_module

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

Это первый раз, когда я заметил этот модуль, поэтому, если вы внедрите его в свои инструменты, прокомментируйте, насколько хорошо он работает для вас.

cndnflyr
источник
Хорошая находка! Это работает, если добавить именно так, как вы показываете. Мне нужно только щелкнуть правой кнопкой мыши -> обновить на панели инструментов, если сам файл .pyt изменяется. Вспомогательные модули и их подмодули успешно перезагружаются. Однако, одно предостережение - я иногда получал пару необъяснимых исключений и сбой ArcMap (хотя, к сожалению, сбой ArcMap не так уж и ненормален). Примечание. Я проверил это только с помощью вспомогательного модуля и одного зависимого субмодуля. Может сообщить о стабильности в будущем.
Джош Вертс
1
Супер, спасибо за отзыв. Да, когда я за рулем ArcMap, я иногда чувствую себя как манекен для краш-теста.
cndnflyr
К сожалению, я столкнулся со слишком многими проблемами стабильности с этим перегрузчиком, поэтому я изменил выбранный ответ на оригинальную встроенную функцию reload (). Иногда проще, тем лучше!
Джош Вертс