Используя Python Distribution Utilities (distutils), наборы инструментов Python и пользовательские наборы инструментов, содержащие инструменты-модели и/или инструменты-скрипты, можно успешно передавать пользователям ArcGIS в форме модулей Python. Процесс создания и распространения наборов инструментов начинается с создания модуля Python. Модулем, который используется в этом упражнении, будет foo.py.
foo.py
Пример кода для создания модуля Python foo:
import os
def hello():
print('Hello ' + os.getenv('username'))
Чтобы модуль был корректно создан и размещен, должна иметь место особая структура каталогов. Для хранения модуля foo должен быть создан каталог с именем foo. Поскольку распределение требует, чтобы каталог с модулем foo находился в родительском каталоге, то создается каталог с именем src для вмещения каталога foo и модуля foo. Структура каталогов должна быть следующей:

Чтобы модуль foo инициализировал и автоматически запустил определённый код после его импорта, требуется файл __init__.py. При нахождении файла __init__.py в требуемом местоположении, пользователи смогут работать с модулем foo и импортировать выбранные определения.
__init__.py
Пример кода для создания __init__.py для модуля foo:
from foo import hello
Структура каталогов теперь должна быть следующей:

С корректной структурой файлов и каталогов модуль foo может быть импортирован через import foo, и может быть вызвана и выполнена foo.hello(). Следующим шагом будет построение пакета распространения (дистрибутива) для модуля foo с тем, чтобы его можно было установить в каталог Python site-packages для удобного совместного использования. Этого можно добиться, написав скрипт setup.py.
setup.py
Пример кода для создания setup.py:
from distutils.core import setup
setup(name='foo',
version='1.0',
packages=['foo'],
package_dir={'foo': 'foo'},
)
Файл setup.py содержит имя и версию модуля и указывает утилите сборки на каталог пакета. Файл setup.py должен быть сохранен в каталоге src. Здесь структура каталогов должна быть следующей:

Установщик для модуля foo может быть построен посредством запуска из каталога src одной из указанных ниже команд с использованием соответствующей строки операционной системы при правильном размещении структуры каталогов. Этот пример создан в операционной системе Windows.
Windows:
python setup.py bdist_wininst
Linux:
python setup.py bdist_rpm
Построитель Windows создаёт каталоги dist и build в каталоге src. В каталоге dist создается файл foo-1.0.win32.exe. Это исполняемый файл, который может распространяться для установки модуля foo в директорию Python site-packages на компьютере с ОС Windows. Помимо запуска исполняемого файла модуль foo можно установить, напрямую скопировав каталог foo из каталога build/lib в каталог Python site-packages. Если существуют ограничения для пользователей на запуск исполняемых файлов, то копирование каталога foo из каталога build/lib в каталог site-packages приведет к тому же результату, что и установка его посредством запуска исполняемого файла. Когда модуль foo установлен или скопирован в каталог site-packages, структура должна быть следующей:

Этот процесс может быть реализован с целью расширения возможностей геообработки путем добавления пользовательских наборов инструментов и/или наборов инструментов Python непосредственно в системные наборы ArcGIS. Как любой системный набор инструментов, он находится в списке системных наборов в ArcGIS и может иметь обертки ArcPy для расширения ArcPy. Кроме того, это позволит модулю пользовательского набора инструментов использовать преимущества устоявшейся методологии, которая применяется системными наборами инструментов ArcGIS для распространения сообщений, для основанной на языке справки и для реакции на локализованные настройки. ArcGIS Desktop будет осуществлять поиск в местоположении Python site-packages, чтобы определить, в каждом ли модуле существует каталог с именем esri. Каталог esri содержит пользовательские наборы инструментов вместе с соответствующими файлами справки. Ниже представлена структура каталогов для английского языка:

Пользовательские наборы инструментов (.tbx и .pyt) находятся в папке esri/toolboxes вместе со скриптами, если используются инструменты-скрипты. В директории esri/help/gp хранятся метаданные (.xml) для пользовательских инструментов и наборов инструментов. Правила наименования наборов инструментов – <псевдоним набора инструментов>_toolbox.xml, а для инструмента – <имя инструмента>_<псевдоним набора инструментов>.xml. В каталоге esri/help/gp/messages хранятся файлы сообщений геообработки (.xml). Эти файлы сообщений используются в наборах инструментов Python для интернационализированных сообщений. Замещающие файлы надписей инструментов и наборов инструментов находятся в директории esri/help/gp/toolboxes. Путем создания нового набора инструментов Python SamplePythonToolbox можно продемонстрировать весь процесс расширения геообработки с использованием модулей Python. Для получения дополнительной информации о создании наборов инструментов Python и работе с ними см. Создание нового набора инструментов Python.
SamplePythonToolbox.pyt
Пример кода создания набора инструментов Python:
import arcpy
import os
import foo
class Toolbox(object):
def __init__(self):
"""Define the toolbox (the name of the toolbox is the name of the
.pyt file)."""
self.label = "Toolbox"
self.alias = "SampleToolbox"
# List of tool classes associated with this toolbox
self.tools = [SampleTool]
class SampleTool(object):
def __init__(self):
"""Define the tool (tool name is the name of the class)."""
self.label = "Sample Tool"
self.description = ""
self.canRunInBackground = False
def getParameterInfo(self):
"""Define parameter definitions"""
params = None
return params
def isLicensed(self):
"""Set whether tool is licensed to execute."""
return True
def updateParameters(self, parameters):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parameter
has been changed."""
return
def updateMessages(self, parameters):
"""Modify the messages created by internal validation for each tool
parameter. This method is called after internal validation."""
return
def execute(self, parameters, messages):
"""The source code of the tool."""
messages.AddMessage(os.getenv("username") + " welcome to the sample tool")
foo.hello()
return
В SamplePythonToolbox.pyt был импортирован модуль foo, и метод запуска класса SampleTool вызвал функцию hello из модуля foo. Это эффективный путь использования пользовательского кода Python как модуля и применения его функциональных возможностей в инструментах геообработки ArcGIS. Как только SamplePythonToolbox.pyt создан и справка боковой панели настроена для набора инструментов посредством метаданных, отредактированных в контекстном меню Описание элемента или создан скомпилированный пользователем файл справки (.chm), он и его сопровождающие файлы .xml должны быть скопированы из каталога, где он был создан. С помощью ArcCatalog или окна Каталог скопируйте файлы в каталог esri/toolboxes, расположенный в структуре каталогов. Компоновка файла и каталога esri должна быть следующая:

Новая структура каталогов должна быть следующей:

Чтобы отразить эти изменения в нашем распределении, нужно отредактировать файл setup.py.
Новый файл setup.py
Пример кода для включения изменений директории setup.py:
from distutils.core import setup
setup(name='foo',
version='1.0',
packages=['foo'],
package_dir={'foo': 'foo'},
package_data={'foo': ['esri/toolboxes/*.*']},
)
Новый setup.py отличается от исходного одной строкой, в которой дополнительные данные, находящиеся в каталоге esri, добавляются к пакету. Теперь, когда построитель (builder) для модуля foo запущен и модуль устанавливается, в каталоге Python site-packages будет создана следующая структура каталогов:

С помощью ArcGIS Desktop и Python Distribution Utilities (Distutils) вы можете создать и установить пакет, который расширит возможности геообработки пользовательскими наборами инструментов, которые будут доступны для просмотра и запуска из системных наборов инструментов ArcGIS. Для английского языка больше ничего не требуется. В разделе Интернационализация подробно рассматривается процесс расширения геообработки с использованием той же методологии, которая использовалась Esri, для упаковки этого модуля для распространения на других языках, помимо английского.