Пакет скриптов Python

Более подробно:

Большинство инструментов-скриптов Python, которые успешно запускаются на компьютере, будут успешно паковаться и запускаться в распакованном виде на другом компьютере, поэтому нет необходимости менять скрипты каким-либо образом. Однако, если возникли проблемы, это может быть связано с использованием скриптом жестко прописанных путей к данным или использованием выражений import для импорта разработанных пользователем модулей Python.

Как обнаружить данные в своем скрипте

При предоставлении общего доступа к результату в виде пакета или службы и ссылки этого результата на скрипт-инструмент, последний сканируется для определения каких-либо данных, использованных в этом скрипте. При обнаружении пути к данным, они консолидируются во временной папке, которая добавляется в пакет.

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

В рамках настоящего обсуждения внимание уделяется только данным, которые используются в качестве входных для инструментов геообработки или путей, ссылающихся на другие интересующие модули Python. Выходные данные также собраны в одном месте.

При обнаружении в сценарии строки в кавычках проверка на существование данных проходит следующим образом:

  • Ссылается ли строка на слой карты?
  • Содержит ли строка абсолютный путь к данным, например e:\Warehousing\ToolData\SanFrancisco.gdb\streets?
  • Ссылается ли строка на данные, которые размещены относительно самого скрипта? Местоположением скрипта является папка, содержащая скрипт.
    • Если скрипт встроен в набор инструментов, местоположением является папка, содержащаяся в наборе инструментов.
    • Если скрипт находится в наборе инструментов Python, местоположением является папка, содержащая в набор инструментов Python.

Эти проверки выполняются последовательно. Если тест пройден и данные существуют, они будут консолидированы.

Примечание:

Если консолидируются папки, копируются только файлы и наборы геоданных, содержащиеся в папке; подпапки не копируются. Некоторые наборы геоданных, например файловые базы геоданных, растры и TIN, формально считаются папками, однако они также являются наборами геоданных, поэтому будут копироваться. Если папка содержит файлы слоев, все данные, на которые ссылается файл слоев, также консолидируются так, что любые процедуры arcpy.mp в скрипте могут получить доступ к данным, на которые имелись ссылки.

Подсказка:

Учитывая способ консолидации папок, избегайте размещения в папке больших наборов данных и файлов, которые никогда не будут использоваться инструментом; необходимо увеличить размер упаковываемых данных.

Примеры

Приведенные ниже примеры основаны на этой структуре папок:

Папка примера проекта

Относительные пути и папки

Следующий способ поиска данных относительно местоположения сценария является обычным шаблоном. Для справки: приведенный ниже код скрипта содержится в папке Scripts, указанной выше. Папка ToolData содержит SanFrancisco.gdb. В SanFrancisco.gdb есть класс объектов с именем Streets. В приведенном ниже примере кода путь к папке ToolData формируется относительно местоположения скрипта (папка Scripts).


import arcpy
import os
import sys

# Get the pathname to this script, then strip off the
#  script file name to yield the containing folder
#
scriptPath = sys.path[0]
thisFolder = os.path.dirname(scriptPath)

# Construct paths to ../ToolData/SanFrancisco.gdb/Streets and
#                    ../ToolData/Warehouse.lyr
#
toolDataPath = os.path.join(thisFolder, "ToolData")
streetFeatures = os.path.join(toolDataPath, "SanFrancisco.gdb", "Streets")
streetLyr = os.path.join(toolDataPath, "Warehouse.lyr")

В приведенном выше коде строка "ToolData" (аргумент для функции os.path.join) проверяется на предмет ее существования. В этом случае имеется папка ToolData, расположенная относительно местоположения скрипта. Эта папка ToolData будет консолидирована – все ее содержимое (за исключением подпапок, как уже говорилось выше) будет упаковано или загружено на сервер (если только папка ToolData не является частью хранилища данных сервера).

Обратите внимание, что копируется содержимое папки, а не отдельные файлы. Например, в приведенном выше коде создается путь к набору данных e:/Warehousing/ToolData/SanFrancisco.gdb/Streets. Процесс консолидации не изолирует и копирует только набор данных Streets — копируется вся папка ToolData.

Абсолютный путь к набору геоданных

Абсолютный путь начинается с буквы диска, например e:/, как показано ниже на примере кода.


streetFeatures = 'e:/Warehousing/ToolData/SanFrancisco.gdb/Streets'

В вышеприведенном коде консолидируется набор данных Streets и все прочие данные, от которых зависит этот набор (например, классы отношений и домены).

Гибридный пример


toolDataPath = r'e:\Warehousing\ToolData'
warehouseLyr = os.path.join(toolDataPath, "Warehouse.lyrx")

В приведенном выше коде консолидируется все содержание папки ToolData. Так как консолидируется содержимое папки (за исключением подпапок), Warehouse.lyrx консолидируется вместе с другими данными, на которые ссылается Warehouse.lyrx.

Прямые и обратные косые черты

В Windows обратная косая черта (\) используется в качестве разделителя при указании пути. UNIX-системы используют прямую косую черту (/).

Примечание:

ArcGIS преобразует прямые и обратные косые черты в соответствующие правила операционной системы.

Обратная косая черта при написании скрипта

Языки программирования берут свое начало в UNIX, а язык С, как и Python, рассматривает обратную косую черту (\) как знак перехода. Например, \t означает табуляцию. Поскольку пути могут содержать обратные косые черты, необходимо запретить их использование в качестве знака перехода. Рекомендуется преобразовывать пути в необработанные строки Python с помощью директивы r, как показано ниже. Благодаря этому Python будет игнорировать обратные косые черты.

thePath = r"E:\data\telluride\newdata.gdb\slopes"

Импорт других модулей Python

Пользовательский скрипт может импортировать другие разработанные скрипты. Например, в приведенном ниже коде показан импорт модуля Python с именем myutils, который находится в той же папке, что и родительский скрипт, и содержит процедуру с именем getFIDName.


import arcpy
import myutils
inFeatures = arcpy.GetParameterAsText(0)
inFID = myutils.getFIDName(inFeatures)

При каждом обнаружении выражения import, местоположение скрипта определяется в следующем порядке:

  • Та же папка, содержащая скрипт. Если скрипт встроен в набор инструментов, используется папка, содержащаяся в наборе инструментов.
  • Папка, которая указана в системной переменной PYTHONPATH.
  • Любая папка, на которую ссылается системная переменная PATH.
Если импортируемый скрипт находится в любой из этих папок, скрипт консолидируется. Процесс сканирования является рекурсивным — импортированный скрипт также сканируется на наличие проектных данных и импортируется в соответствии со всеми приведенными выше правилами.

Другим способом ссылки на модули, которые следует импортировать, является использование метода sys.path.append. Это позволяет задать путь к папке, содержащей скрипты, которые должны быть импортированы.


import arcpy
import sys
import os

# Append the path to the utility modules to the system path
#  for the duration of this script.
#
myPythonModules = r'e:\Warehousing\Scripts'
sys.path.append(myPythonModules)
import myutils # a Python file within myPythonModules

В приведенном выше коде следует обратить внимание, что метод sys.path.append нуждается в папке в качестве аргумента. Так как 'e:\Warehousing\Scripts' является папкой, будет консолидировано все содержимое папки. Правила копирования содержимого папки применяются и здесь: все содержимое папки копируется, кроме подпапок, которые не являются наборами геоданных.

Примечание:

Скрипты Python в папке не сканируются на предмет наличия данных проекта или импортированных модулей.

Код проверки инструмента

Если у вас есть опыт написания инструментов-скриптов, вы можете использовать пользовательский инструмент логики проверки. Логика проверки реализована в Python, поэтому код проверки будет отсканирован на наличие проектных данных и модулей, как и любой другой скрипт Python. Например, логика проверки может открыть папку (например, d:\approved_projections), содержащую файлы проекции (.prj) для создания списка выбора пространственных привязок, которые может выбрать пользователь при запуске этого инструмента. Эта папка не является параметром инструмента; это путь к данным, который используется в скрипте проверки. Здесь применяются те же правила, приведенные выше для скриптов Python, следствием чего становится консолидация папки d:\approved_projections и добавление ее в пакет.

Библиотеки сторонних производителей

Модули сторонних производителей (любой модуль, не являющийся частью установочного пакета Python) не консолидируются. Вы должны убедиться, что модуль установлен на компьютере, где распаковывается пакет. Необходимо предоставить документацию инструмента и пакет, указывающий, какие сторонние модули необходимы. Это не относится к сторонним модулям, которые устанавливаются вместе с ArcGIS, включая numpy, matplotlib и pandas.