Pythonを使用してスクリプトツールでパラメーターを設定しますか?


8

私は何度も何度も同じ問題であなたを悩ませることを嫌いますが、コードにわずかな変更を加えるたびに新しい問題に遭遇します。以下のコードで私が行ったのは、フィールド名を元のフィーチャクラスと一致するように置き換えることだけでした。今では機能しません。それは私にくれました

<type 'exceptions.RuntimeError'>: ERROR 999999: Error executing function. Failed to execute (Script).

エラーメッセージを表示せず、結果も表示しないコードに、Try / Exceptを追加してみました。

何が起こっているのかわかりませんか?これを理解するための助けは非常に高く評価されます。

import arcpy, os
Try:
roadpath = arcpy.GetParameterAsText(0)
tablepath = arcpy.GetParameterAsText(1)

datapath = os.path.split(tablepath)[0]
tablename = os.path.split(tablepath)[1]
rows = arcpy.SearchCursor(roadpath,"FROMLEFT <> 0 AND TOLEFT <> 0","","STREET_NAME_ID;FROMLEFT;TOLEFT","STREET_NAME_ID A;FROMLEFT A;TOLEFT A")
arcpy.env.workspace = datapath

if arcpy.Exists(tablename):
    arcpy.DeleteRows_management(tablename)
else:
    arcpy.CreateTable_management(datapath,tablename,roadpath)
    arcpy.DeleteField_management(tablename,"SHAPE_Length")

irows = arcpy.InsertCursor(tablename)
first = True
for row in rows:
    if first:
        first = False
    else:
        GISID = row.GIS_ID
        stid = row.STREET_NAME_ID
        fl = row.FROMLEFT
        tl = row.TOLEFT
        if stid == prev_stid and fl <= prev_tl:
            irow = irows.newRow()
            irow.GIS_ID = prev_GISID
            irow.STREET_NAME_ID = prev_stid
            irow.FROMLEFT = prev_fl
            irow.TOLEFT = prev_tl
            irows.insertRow(irow)
            del irow
            irow = irows.newRow()
            irow.GIS_ID = GISID
            irow.STREET_NAME_ID = stid
            irow.FROMLEFT = fl
            irow.TOLEFT = tl
            irows.insertRow(irow)
            del irow
    prev_GISID = row.GIS_ID
    prev_stid = row.STREET_NAME_ID
    prev_fl = row.FROMLEFT
    prev_tl = row.TOLEFT
del rows, irows
except:
print arcpy.GetMessages()

こんにちは、サム。GIS.seへようこそ:) try ... exceptブロックですべてrows =irows包括的にすることで、より明確なエラーメッセージが表示されるかどうかを確認します。また、データのサンプルと完全なスクリプトをどこかに置くことができる場合にも役立ちます(minus.comは、簡単に公開共有できる場所の1つです)。
マットウィルキー

Qのコード形式を修正しました。エラーメッセージの一部が山かっこで処理されていました。参考までに、編集モードのときに[ctrl]-[K]をたたくと、選択したテキストにコードフォーマットが自動的に適用されます。ブロックは4つのスペースでインデントされ、バックティックを使用したインラインコード:` ` (ref)
matt wilkie

あなたの最新の編集に関しては、2行目に定義された変数がではtablepathなくを読み取るように見えますtablename。これは単なるフォーラムの誤植ですか、それとも実際にスクリプトの中でそうですか?エラーは前者を示唆しているので、両方のパラメーターに渡す値の例を提供できますか?またimport arcpy、スクリプトの上部に行がありますか?
blah238

これをデバッグする方法はありません。PyScripterまたは別のPython IDEを入手してデバッグを開始してください。mattが言ったこととは逆に、try / exceptを削除すると、プログラムが爆撃するときに完全なスタックトレースが得られるはずです。また、トレースバックモジュールを使用してスタックトレースを明示的に書き込むこともできますが、try / exceptを削除するだけでは不十分です。参照:blogs.esri.com/Dev/blogs/geoprocessing/archive/2008/12/01/…2D00 -Error -handling-in-Python-script-tools.aspx
blah238

問題はフィールド名の長さでした。どうやら、Pythonは長いフィールド名(> 10文字)を好みません。今は動いているようです。明日新しいことを試すつもりで、新しい問題に出くわすと確信しています。しかし、あなたの提案をありがとう。Pythonスクリプトのデバッグ方法を学ぶ必要があります。リソースを知っていますか?
サム

回答:


4

現在設定しているパラメーターは、実際の出力ではなく、ジオプロセシングメソッドへの単純な文字列引数であるため、実際には「出力」パラメーターであってはなりません。

これには2つの方法があります。

  1. 出力テーブルへの完全なパスを供給し、使用して必要なパス成分には、このパラメータを解析するためにスクリプトロジックを更新するタイプの表の単一の出力パラメータを使用して2「出力場所」と「出力表」パラメータを交換 os.path.splitするために、必要に応じて使用しているジオプロセシング関数。
  2. 「出力場所」と「出力テーブル」のパラメーターを入力パラメーターに変更します(「出力テーブル」の名前を「出力テーブル名」に変更して、テーブルへのフルパスではなくテーブルの名前にすぎないことを明確にします)。タイプ2の新しい4番目のパラメーターを作成し、スクリプトツールのToolValidatorクラスを変更して、パラメーター2と3が検証された後にその値を設定します。

最初の方法はおそらくより簡単な方法です-ToolValidatorロジックは正しく理解するのが難しく、デバッグが困難です。

編集:実際には、目的に合った3番目のオプションがあります-これは方法2と同じですが、ToolValidatorを変更する代わりSetParameterAsTextに、スクリプトの最後に呼び出して、4番目の派生パラメーターの値を設定します。以前、ModelBuilderで使用されるスクリプトツールでSetParameterAsTextに問題がありましたが、現在は修正されている可能性があります。


2

また、すべてのコードをコメント化し、渡したパラメーター値を出力することも検討します。常に少しデバッグしておくとよいでしょう。

それらが入ってくるときにparametsrをチェックすることも良い練習です:

# First parameter is ID
ID = long(arcpy.GetParameterAsText(0))

# parameter is optional feature class prefix 
appPrefix = arcpy.GetParameterAsText(1)
if (not appPrefix) or (appPrefix == "#") or (len(appPrefix.strip()) == 0):
    appPrefix = ""

# Optional schema owner
schemaOwner = arcpy.GetParameterAsText(2)
if (not schemaOwner) or (schemaOwner == "#") or (len(schemaOwner.strip()) == 0):
    schemaOwner = ""
else:
    schemaOwner = schemaOwner + "."

# Optional workspace - for use with ArcGIS Desktop. No default.
workspace = arcpy.GetParameterAsText(3)
if (not workspace) or (workspace == "#") or (len(workspace.strip()) == 0):
    workspace = os.path.join(sys.path[0], connFile)

そのような何か、それからそれらを見ることができるように変数を印刷することを確認してください:

arcpy.AddMessage("ID : " + str(Id))

または

print "ID : " + str(Id)

等常に尾を追いかけることになるので、入ってくる値がゴミではないことを知る必要があります。

row / curをtry catchに入れることも良い習慣です。


0

私は何とか同意します。すべてのパラメータの方向は「入力」である必要があります。また、ツールパラメーター3のデータ型、出力テーブルをファイルオブジェクトとして指定しています。これを「テーブル」または「文字列」として試してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.