Оновлення імпортованих модулів у 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)
  ...

Таким чином, кожен раз, коли ви запускаєте інструмент, ви обов'язково матимете оновлений модуль. Після розробки це можна вийняти.


1
Надзвичайно корисно, і це вирішує простий приклад, який я розмістив. Однак якщо підтримка_модуль також імпортує інші допоміжні модулі, їх також потрібно буде викликати з перезавантаженням. Я думаю, що це найкраще, що ми отримаємо, оскільки це має сенс у тому, як Python завантажує модулі - я позначу ваш як відповідь, якщо щось наступне наступне число не з’явиться більш надійного.
Джош Вертс

Дуже корисний. Я виявив, що достатньо зателефонувати reload()відразу після імпорту підтримуючого модуля, у верхній частині PYT-файлу панелі інструментів. Таким чином, якщо панель інструментів містить кілька інструментів, мені не доведеться дублювати перезавантаження у функції кожного інструмента execute().
Майк Фінч

Я насправді не розумію, як ця негідниця вирішує проблему. У мене інструменти зберігаються у .py-файлах, і я імпортую їх за допомогою from pyfile import Toolдодавання reload(tool)повертань typeError: reload() argument must be module. Будь-які ідеї?
Ратнаніл

2
Я знайшов рішення! спочатку імпортуйте py-файл як модуль, перезавантажте та потім імпортуйте клас у модулі. Див: stackoverflow.com/a/6946467/4139249
Ratnanil

5

Ось інший і надійніший спосіб, ніж я пропонував раніше.

Я сам не користувався цим модулем, але думаю, що він вирішить вашу проблему:

Перевантажувач модулів Python

Ця бібліотека реалізовує модуль для завантаження модулів на основі Python. На відміну від вбудованої функції reload (), цей перевантажувач перезавантажить запитуваний модуль та всі інші модулі, які залежать від цього модуля.

З огляду на попередній приклад, це повинно завантажувати всі групи залежності одним викликом:

import reloader
reloader.enable()

import supporting_module

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

Це перший раз, коли я помітив цей модуль, тому, якщо ви реалізуєте його у своїх інструментах, прокоментуйте ще раз про те, наскільки він добре працює для вас.


Гарна знахідка! Це спрацювало, якщо додано точно так, як ви показуєте. Мені потрібно лише клацнути правою кнопкою миші -> оновити на панелі інструментів, якщо сам файл .pyt зміниться. Підтримуючі модулі та їх підмодулі успішно завантажуються. Один застереження, однак - я отримав кілька незрозумілих винятків при нагоді та аварії ArcMap (хоча збої ArcMap дійсно не такі ненормальні, на жаль). Примітка. Я перевірив це лише з допоміжним модулем та одним залежним підмодулем. Може повідомити про стабільність у майбутньому.
Джош Вертс

1
Супер, дякую за повідомлення. Так, під час водіння ArcMap я іноді відчуваю себе манекеном з краш-тесту.
cndnflyr

На жаль, у мене виникло занадто багато проблем зі стабільністю з цим перевантажувачем, тому я змінив обрану відповідь на оригінальну вбудовану функцію reload (). Іноді простіше - краще!
Джош Вертс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.