Обычным шаблоном кодирования, используемым в AML, было выполнение AML (с параметрами) внутри другого AML.
Приложение, которое я сейчас разрабатываю, выиграло бы от возможности запуска скрипта Python (с параметрами) в другом скрипте Python.
Тем не менее, это не так просто.
Используя ArcGIS 10, я экспериментирую с переносом «внутреннего» скрипта Python в инструмент ArcGIS, который имеет параметры. Я подумал, что было бы просто сделать так, чтобы «внешний» скрипт Python использовал arcpy.ImportToolbox для импорта набора инструментов, а затем запустил инструменты внутри него. Однако при тестировании пока все мои попытки запустить «внутренний» инструмент из «внешнего» скрипта, похоже, просто пропускают «внутренний» инструмент (ошибки не выдается).
Вот некоторый тестовый код, чтобы попытаться лучше проиллюстрировать то, что я пытаюсь описать.
Мой скрипт testinner.py:
inputString = arcpy.GetParameterAsText(0)
newFC = "C:\\Temp\\test.gdb\\" + inputString
arcpy.Copy_management("C:\\Temp\\test.gdb\\test",newFC)
Мой скрипт testouter.py:
import arcpy
inputString1 = arcpy.GetParameterAsText(0)
inputString2 = arcpy.GetParameterAsText(1)
arcpy.ImportToolbox("C:\\Temp\\test.tbx")
arcpy.testinner_test(inputString1)
arcpy.testinner_test(inputString2)
Для testinner.py его инструменту нужен единственный параметр String.
Для testouter.py его инструменту нужны два параметра String
Эти два инструмента помещены в test.tbx.
Для test.gdb нужен только один пустой класс пространственных объектов, который называется test.
После того, как вы собрали все вышеперечисленное, запуск инструмента testinner с передачей строки, подобной 'abc', в качестве параметра которой должен привести к тому, что класс пространственных объектов 'test' будет скопирован в тот, который называется abc.
Но когда вы пытаетесь запустить инструмент testouter с двумя строками, такими как 'uvw' и 'xyz' в качестве параметров, инструмент testinner в testouter.py, кажется, запускается один раз, но отправляет ArcMap 10 SP2 в Vista SP2 в серьезную ошибку приложения, когда пытаясь использовать его во второй раз.
Тот же тест с использованием Windows XP SP3 и ArcGIS Desktop 10 SP2 также выдает серьезную ошибку приложения в той же точке.
Ответы:
Вот ваш тестовый пример, модифицированный для импорта «служебного» модуля в основной скрипт и вызова функции с использованием параметров, считываемых инструментом скрипта:
CopyFeaturesTool.py - инструмент-скрипт, который считывает параметры и вызывает функцию в другом модуле.
CopyFeaturesUtility.py - Модуль с единственной функцией
copyFeaturesToTempGDB
. Можно либо импортировать, либо запустить автономно. Если запустить автономно, кодif __name__ == '__main__'
выполняется.Я думаю, вы найдете этот модульный подход намного более эффективным и логичным, когда привыкнете к нему. Раздел « Модули» в стандартном руководстве по Python также является хорошим источником для понимания того, как работает импорт.
Для большего количества специфичных для arcpy примеров взгляните на встроенные скрипты в вашей
C:\Program Files\ArcGIS\Desktop10.0\ArcToolbox\Scripts
папке.источник
Вы можете сделать это, импортировав модуль (т.е. скрипт) в ваш основной скрипт и вызвав его функции. Простая демонстрация содержится в прилагаемых двух сценариях.
для основной программы и для вызываемых функций
Вы просто должны убедиться, что основной модуль и дочерний модуль находятся в одной папке. Вы можете легко передать параметры в дочерний модуль, и если дочернему модулю нужен доступ к arcpy (при условии, что вы используете версию 10 arcmap), просто передайте ссылку на него.
источник
Импорт и запуск функции - более чистый способ сделать это, но для полноты картины есть также
execfile
встроенная функция ( документация ), которая позволит вам запустить произвольный файл в текущем контексте.источник
Метод execfile, описанный @JasonScheirer, позволил мне перестроить код ниже и предоставил решение моей тестовой задачи:
Однако это может оказаться громоздким при применении к не тестовым скриптам, которые намного длиннее, поэтому я использовал работу @ blah238, которая одобрила подход @ DanPatterson, и предложил следующий финальный (тестовый) код, который делает именно то, что мне нужно.
а также
источник