Рекомендации по организации наборов инструментов Python (.pyt) в ArcGIS

17

Для одной из моих задач мне нужно создать панель инструментов с тремя инструментами (скриптами Python).

Вместо обычного tbx я решил написать его как Python Toolbox (pyt).

Все понятно, кроме «хорошего» способа организации кода.

Поскольку у меня есть три инструмента, это не очень хороший способ хранить их в одном файле (pyt). Итак, я решил сохранить каждый инструмент в отдельном файле .py.

Здесь возникает проблема: как правильно организовать несколько файлов с помощью PYT для распространения или развертывания на ArcGIS for Server? Должен ли я держать их на одном уровне с PYT-файлом или поместить их в какой-либо подкаталог (например, «Инструменты»)?

Можете ли вы порекомендовать какие-либо руководящие принципы Esri или образец "большой набор инструментов PYT"?

Я не нашел ничего по этой теме. В версии 10.0 была так называемая структура папок ToolShare, которую я использовал.

Это больше вопрос стиля кодирования. Потому что идея создать один PYT-файл с 500-1000 или более строками кода мне не очень нравится, и я считаю, что это не "питонический" способ

Алекс Марков
источник
1
«Идея создать один PYT-файл с 500-1000 или более строками кода мне не нравится». Ты не одинок, Алекс. Сегодня я быстро заявил, что .pyt - изобретение больного ума. И я не буду сожалеть об этом.
Ремигиюс Панкявичюс

Ответы:

17

Посмотрите эту тему на форуме ArcGIS. В основном просто используйте стандартные модули Python или структуру пакета и импортируйте свои инструменты в набор инструментов Python.

Что-то вроде:

#  \--SomeDir
#     |  toolbox.pyt
#     \--toolpackage
#        |  __init__.py
#        |  script_a.py
#        |  script_b.py


#----------------------------
#The .pyt file
#----------------------------

import arcpy
import toolpackage.script_a.Tool1 as Tool1
import toolpackage.script_a.Tool2 as Tool2
import toolpackage.script_b.Tool3 as Tool3

class Toolbox(object):
    def __init__(self):
        """Define the toolbox (the name of the toolbox is the name of the
        .pyt file)."""
        self.label = "MultiTool Toolbox"
        self.alias = "mtt"

        # List of tool classes associated with this toolbox
        self.tools = [Tool1, Tool2, Tool3]
user2856
источник
Я обнаружил, что в ArcGIS Desktop это работает нормально, но при публикации сервиса геообработки в экземпляре ArcGIS Server он теряет все скрипты и пакеты, кроме файла .pyt. Может быть возможно вручную добавить сценарии в развертывание, но это увеличивает сложность.
Комнат
3
@Gnat Да, мысли Люка - тоже мой опыт. Издательские службы ESRI не распознают from x import yимпорт стилей. (Между прочим, это совершенно нелепо.) Однако я считаю, что вы можете оставить свое self.toolsопределение в покое и использовать import toolpackage.script_a.Tool1 as Tool1.
jpmc26
1
Псевдоним должен быть коротким и содержать только буквы, т.е. self.alias = "mtt"
Куртис Прайс
2
Поскольку я потратил целый час на внесение изменений в код своего инструмента и пытался показать, что он отражен в интерфейсе инструментов в Arcmap, я хотел бы поделиться этим. Если вы вносите изменения в свой код за пределами файла pyt и хотели бы, чтобы это было отражено в графическом интерфейсе инструмента, вам необходимо перезапустить ArcMap / Catalog. Вы можете нажать обновить на панели инструментов все, что вы хотите, это только кажется, чтобы перезагрузить сам Pyt. Он не найдет изменений в другом коде.
TurboGus
1
@TurboGus gis.stackexchange.com/q/91112/2856
user2856