2013-10-02 124 views
3

我已經創建了一個從ArcMap 10.1會話運行的python腳本;不過,如果可能的話,我想修改它作爲獨立腳本運行。問題是我沒有看到在ArcMap外部執行時提示用戶輸入參數的解決方法。如何使用arcpy.GetParameterAsText作爲獨立腳本運行時更改python腳本?

這可以合理地完成嗎?如果是這樣,我將如何處理它?以下是我的腳本示例。我怎樣才能修改這個命令來提示用戶在命令行輸入參數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) 

這是一個哲學問題,因爲它是一個程序化的問題。我對這是否可以完成以及這樣做的努力量感興趣。是否值得方便的不打開地圖文件?

回答

1

檢查是否指定了參數。如果沒有指定它們,請執行下列操作之一:

  • 使用Python的raw_input()方法來提示用戶(見this question)。
  • 打印「使用情況」消息,指示用戶在命令行上輸入參數,然後退出。

提示用戶看起來是這樣的:

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 
+0

即使只有必需的參數,我也會得到該錯誤。 –

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()