Как изменить скрипт Python с помощью arcpy.GetParameterAsText при запуске в качестве отдельного скрипта?

Я создал скрипт Python, который запускается из сеанса ArcMap 10.1; однако я хотел бы изменить его, чтобы он работал как отдельный скрипт, если это возможно. Проблема в том, что я не вижу обходного пути для запроса параметров у пользователя при выполнении вне ArcMap.

Можно ли это сделать разумно? Если да, то как бы я к этому подошел? Ниже приведен пример моего скрипта. Как я могу изменить это, чтобы запрашивать у пользователя в командной строке пути к параметрам 0 и 1?

import arcpy
arcpy.env.overwriteOutput = True

siteArea = arcpy.GetParameterAsText(0)
tempGDB_Dir =  arcpy.GetParameterAsText(1)
tempGDB = tempGDB_Dir + "\\tempGDB.gdb"

#  Data from which records will be extracted
redWoods = "D:\\Data\\GIS\\Landforms\\Tress.gdb\\Redwoods"
# List of tree names that will be used in join
treesOfInterest = "C:\\Data\\GIS\\Trees\\RedwoodList.dbf"

inFeature = [redWoods, siteArea]
tempFC = tempGDB_Dir + "\\TempFC"
tempFC_Layer = "TempFC_Layer"
output_dbf = tempGDB_Dir + "\\Output.dbf"

#  Make a temporaty geodatabase
arcpy.CreateFileGDB_management(tempGDB_Dir, "tempGDB.gdb")

#  Intersect trees with site area
arcpy.Intersect_analysis([redWoods, siteArea], tempFC, "ALL", "", "INPUT")
#  Make a temporary feature layer of the results
arcpy.MakeFeatureLayer_management(tempFC, tempFC_Layer)

#  Join redwoods data layer to list of trees
arcpy.AddJoin_management(tempFC_Layer, "TreeID", treesOfInterest, "TreeID", "KEEP_COMMON")

#  Frequency analysis - keeps only distinct species values
arcpy.Frequency_analysis(tempFC_Layer, output_dbf, "tempFC.TreeID;tempFC.TreeID", "")

#  Delete temporary files
arcpy.Delete_management(tempFC_Layer)
arcpy.Delete_management(tempGDB)

Это вопрос настолько же философский, насколько и программный. Меня интересует, можно ли это сделать, и количество усилий, чтобы сделать это таким образом. Стоит ли усилий удобство не открывать документ карты?


person user12059    schedule 02.10.2013    source источник


Ответы (2)


Проверьте, были ли заданы параметры. Если они не были указаны, выполните одно из следующих действий:

  • Используйте метод Python raw_input() для запроса пользователя (см. этот вопрос).
  • Распечатайте сообщение об использовании, в котором пользователю предлагается ввести параметры в командной строке, а затем выйти.

Подсказка пользователю может выглядеть так:

siteArea = arcpy.GetParameterAsText(0)
tempGDB_Dir =  arcpy.GetParameterAsText(1)
if (not siteArea):
    arcpy.AddMessage("Enter the site area:")
    siteArea = raw_input()
if (not tempGDB_Dir):
    arcpy.AddMessage("Enter the temp GDB dir:")
    tempGDB_Dir = raw_input()

Печать сообщения об использовании может выглядеть следующим образом:

siteArea = arcpy.GetParameterAsText(0)
tempGDB_Dir =  arcpy.GetParameterAsText(1)
if (not (siteArea and tempGDB_Dir)):
    arcpy.AddMessage("Usage: myscript.py <site area> <temp GDB dir>")
else:
    # the rest of your script goes here

Если вы запрашиваете ввод с помощью raw_input(), обязательно задайте все необходимые параметры при добавлении в набор инструментов в ArcGIS for Desktop. В противном случае вы получите эту ошибку от raw_input() при запуске на рабочем столе:

EOFError: EOF when reading a line
person Gary Sheppard    schedule 03.10.2013
comment
Я получаю эту ошибку даже с только обязательными параметрами. - person J Kelly; 29.11.2016

черт возьми, это стоит того, чтобы не открывать arcmap. Мне нравится использовать модуль optparse для создания инструментов командной строки. arcpy.GetParameter(0) полезен только для интеграции с графическим интерфейсом Esri (например, инструменты-скрипты). Вот хороший пример инструмента командной строки Python:

http://www.jperla.com/blog/post/a-clean-python-shell-script

Я включаю класс unittest в свои инструменты для тестирования и автоматизации. Я также держу все операторы arcpy.GetParameterAsText вне какой-либо реальной бизнес-логики. Мне нравится включать внизу:

if __name__ == '__main__':
    if arcpy.GetParameterAsText(0):
        params = parse_arcpy_parameters()
        main_business_logic(params)
    else:
        unittest.main()
person bcollins    schedule 03.10.2013