先週、ToolValidatorクラスのカスタマイズに関する質問を投稿し、いくつかの非常に良い答えを得ました。提案されたソリューションを使用して、データベースでクエリを実行するカスタムモジュールを作成しました。これは、ToolValidatorクラス(ドロップダウンリストに値を提供するため)と後でジオプロセシングスクリプト(他を取得するため)の両方から呼び出されます。ドロップダウンリストで選択した項目に基づくパラメーター)。ただし、ToolValidatorクラスのカスタムモジュールを実際に呼び出すことはできません。私は運が悪くパスに追加しようとしています。これらの変更をスクリプトに適用しようとすると、ランタイムエラーが発生します:[Errno 9]不正なファイル記述子。インポート行をコメントアウトしても、エラーは発生しません。
sys.path.append('my_custom_module_directory')
import my_custom_module
ArcObjectsでカスタムツールを実装しないのはなぜでしょうか。その理由は、私のエンドユーザーが自分のコンピューターにDLLを登録するために必要な特権を持っていないためです。
更新:これはArcGIS 10で発生していました。興味深いことに、最初はToolValidatorクラスのinitialiazeParameters関数内のパスに追加していました。ToolValidatorクラスの外側(上)に追加すると、すべてが期待どおりに機能します。
sys.path.append('C:/Working/SomeFolder')
import somescript -------->THIS WORKS
class ToolValidator:
"""Class for validating a tool's parameter values and controlling
the behavior of the tool's dialog."""
def __init__(self):
"""Setup arcpy and the list of tool parameters."""
import arcpy
sys.path.append('C:/Working/SomeFolder')
import somescript -------> THIS DOESNT WORK
self.params = arcpy.GetParameterInfo()
更新2: 問題の真の原因を見つけたと思います。この投稿のコードスニペットでは、実際のパス(C:/ Working / SomeFolderなど)のように見えるものをsys.pathに追加しています。実際のToolValidatorクラスでは、os.path.dirname(__file__)
+ "\ my_special_folder ..." を使用して相対パスを作成していました。os.path.dirname(__file__)
ToolValidatorクラスが含まれているため、ツールボックスのパスが返されることを期待していました。私はこれが事実ではないことに気づきました。私が知る限り、ToolValidatorクラスは実際には.pyファイルに書き込まれないため、このコードはメモリ内のpythonインタープリターに渡されるため、__file__
役に立たないか、一時スクリプトが永続化されてからexecfile( path_to_script)が呼び出され、再びレンダリングされます__file__
役に立たない。私が他にも欠けている理由があると私は確信しています。
要するに、ハードコードされたパスを使用すると、sys.appendはどこでも機能し、相対パスはToolValidatorクラスではうまく機能しません。