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

ええ、アークマップを開かないという便利さは価値があります。私は optparse モジュールを使ってコマンド ライン ツールを作成するのが好きです。arcpy.GetParameter(0) は、Esri GUI 統合 (スクリプト ツールなど) にのみ役立ちます。以下は、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()
于 2013-10-03T16:08:08.323 に答える