3

我创建了一个从 ArcMap 10.1 会话运行的 python 脚本;但是,如果可能的话,我想将其修改为作为独立脚本运行。问题是我没有看到在 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)

这既是一个哲学问题,也是一个程序问题。我对这是否可以做到以及这样做的努力程度很感兴趣。不打开地图文档的便利值得付出努力吗?

4

2 回答 2

1

检查是否指定了参数。如果未指定,请执行以下操作之一:

  • 使用 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 中将所有参数添加到您的工具箱时都需要。否则,在 Desktop 中运行时会从 raw_input() 收到此错误:

EOFError: EOF when reading a line
于 2013-10-03T15:50:18.720 回答
1

地狱是的,它值得不打开arcmap的便利。我喜欢使用 optparse 模块来创建命令行工具。arcpy.GetParameter(0) 仅对 Esri GUI 集成有用(例如脚本工具)。这是一个很好的 Python 命令行工具示例:

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

我在我的测试和自动化工具中包含了一个单元测试类。我还将所有 arcpy.GetParameterAsText 语句保留在任何实际业务逻辑之外。我喜欢在底部包括:

if __name__ == '__main__':
    if arcpy.GetParameterAsText(0):
        params = parse_arcpy_parameters()
        main_business_logic(params)
    else:
        unittest.main()
于 2013-10-03T16:08:08.323 回答