Python モジュールによるジオプロセシングの拡張
Python 配布ユーティリティ(Distutils)および Python のドキュメント「Distributing Python Modules」に記載された情報を使用して、モデルやスクリプト ツールを含む Python ツールボックスおよびカスタム ツールボックスを、Python モジュールの形式で効率的に ArcGIS ユーザに配布できます。これらのツールボックスを構築して配布するプロセスは、Python モジュールの作成から始まります。この例で使用するモジュールは、foo.py です。
foo Python モジュールを作成するサンプル コードを次に示します。
import os
def hello():
print 'Hello ' + os.getenv('username')
モジュールを正しく構築して配布するには、特定のディレクトリ構造が存在する必要があります。foo というディレクトリを作成し、foo モジュールを格納する必要があります。配布するには、foo モジュールが格納されたディレクトリが親ディレクトリ内に存在する必要があります。そのため、src というディレクトリを作成し、foo ディレクトリおよび foo モジュールをそこに格納します。ディレクトリ構造は、以下のようになります。
foo モジュールをインポートしたときに、特定のコードを初期化して自動的に実行するには、__init__.py ファイルが必要になります。__init__.py を所定の場所に配置することで、ユーザは foo モジュールにアクセスし、選択した定義をインポートできるようになります。
foo 用の __init__.py を作成するサンプル コードを次に示します。
from foo import hello
ここで、ディレクトリ構造は、以下のようになります。
各ファイルを所定のディレクトリ構造に配置することで、import foo を使用して foo モジュールをインポートし、foo.hello() を呼び出して実行できるようになります。次のステップは、foo モジュールの配布パッケージを構築することです。これにより、モジュールを Python の site-packages ディレクトリにインストールして簡単に共有することができます。setup.py スクリプトを記述することによって、これを実行できます。
setup.py を作成するサンプル コードを次に示します。
from distutils.core import setup
setup(name='foo',
version='1.0',
packages=['foo'],
package_dir={'foo': 'foo'},
)
setup.py ファイルでは、モジュールの名前とバージョンを設定し、ビルド ユーティリティに対してパッケージ ディレクトリを指定します。setup.py ファイルは、src ディレクトリに保存します。この時点で、ディレクトリ構造は以下のようになります。
所定のディレクトリ構造を作成することで、該当するオペレーティング システムのコマンド プロンプトを使用して、次のいずれかのコマンドを src ディレクトリ内で実行し、foo モジュール用のインストーラを構築できます。この例では、Windows OS 上で構築します。
必ず、使用しているシステム上で python.exe のパスを設定してください。Windows OS では、Windows OS 環境変数の Path システム変数に C:\Python27\ArcGIS10.2 を追加することによって、これを実行できます。
Windows:
python setup.py bdist_wininst
Linux:
python setup.py bdist_rpm
Windows のビルダは、src ディレクトリ内に dist ディレクトリおよび build ディレクトリを作成します。foo-1.0.win32.exe が、dist ディレクトリに作成されます。このファイルは、foo モジュールを Windows コンピュータ上の Python の site-packages ディレクトリにインストールするために配布できる、実行可能ファイルです。実行可能ファイルを実行して foo モジュールをインストールする代わりに、foo ディレクトリを、build/lib ディレクトリから Python の site-packages ディレクトリに直接コピーすることもできます。実行可能ファイルの実行を禁止するユーザ制約が存在する場合、foo ディレクトリを build/lib ディレクトリから site-packages ディレクトリにコピーすることは、実行可能ファイルを使用してインストールするのと同じ効果があります。foo モジュールを site-packages ディレクトリにインストールまたはコピーすると、ディレクトリ構造は以下のようになります。
このプロセスをさらに実行し、カスタム ツールボックスや Python ツールボックスを ArcGIS システム ツールボックスに直接追加することによって、ジオプロセシング機能を拡張できます。これらのツールボックスは、システム ツールボックスとして ArcGIS 内のシステム ツールボックスのリストから簡単にアクセスできるようになります。ArcPy を拡張するための ArcPy ラッパーを作成することもできます。さらに、カスタム ツールボックス モジュールは、ArcGIS システム ツールボックスがメッセージ配布用に備える十分確立された手法、言語ベースのヘルプ、ローカライズされた設定への対応を活用できるようになります。ArcGIS for Desktop は、Python の site-packages ディレクトリを検索し、esri というディレクトリが各モジュール内に存在するかどうかを調べます。esri ディレクトリには、カスタム ツールボックスとそれらに関連するヘルプ ファイルが格納されています。英語版の場合のディレクトリ構造を、以下に示します。
カスタム ツールボックス(*.tbx および *.pyt)は、サポート用のスクリプト(スクリプト ツールを使用している場合)と共に esri/toolboxes ディレクトリに配置されています。esri/help/gp ディレクトリには、カスタム ツールボックスおよびツール用のメタデータ(*.xml)が格納されます。ツールボックスの命名規則は <toolbox alias>_toolbox.xml であり、各ツールの命名規則は <toolname>_<toolbox alias>.xml です。esri/help/gp/messages ディレクトリには、ジオプロセシング メッセージ(*.xml)ファイルが配置されます。これらのメッセージファイルは、ローカライズする必要のあるメッセージ用に Python ツールボックス内で使用されます。ツールボックスおよびツールのラベル カテゴリのオーバーライド ファイルは、esri/help/gp/toolboxes ディレクトリにあります。SamplePythonToolbox という名前の新しい Python ツールボックスの作成を通じて、Python モジュールを使用したジオプロセシングの拡張プロセス全体を示すことができます。Python ツールボックスの作成と操作の詳細については、http://resources.arcgis.com/ja/help/main/10.1/index.html#//001500000034000000 をご参照ください。
このプロセスで使用する Python ツールボックスのエイリアスを設定することは重要です。
Python ツールボックスを作成するサンプル コードを次に示します。
import arcpy
import os
import foo
class Toolbox(object):
def __init__(self):
"""Define the toolbox (the name of the toolbox is the name of the
.pyt file)."""
self.label = "Toolbox"
self.alias = "SampleToolbox"
# List of tool classes associated with this toolbox
self.tools = [SampleTool]
class SampleTool(object):
def __init__(self):
"""Define the tool (tool name is the name of the class)."""
self.label = "Sample Tool"
self.description = ""
self.canRunInBackground = False
def getParameterInfo(self):
"""Define parameter definitions"""
params = None
return params
def isLicensed(self):
"""Set whether tool is licensed to execute."""
return True
def updateParameters(self, parameters):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parameter
has been changed."""
return
def updateMessages(self, parameters):
"""Modify the messages created by internal validation for each tool
parameter. This method is called after internal validation."""
return
def execute(self, parameters, messages):
"""The source code of the tool."""
messages.AddMessage(os.getenv("username") + " welcome to the sample tool")
foo.hello()
return
SamplePythonToolbox.pyt では、foo モジュールがインポートされ、SampleTool クラスの execute メソッドが foo モジュールの hello 関数を呼び出します。これは、カスタム Python コードをモジュールとして配布し、その機能を ArcGIS ジオプロセシング ツールを介して公開する方法として効果的です。SamplePythonToolbox.pyt を作成し、[アイテム説明] ショートカット メニューで編集されたメタデータによってこのツールボックス用にサイドパネルのヘルプを構成しているか、独自にコンパイルされたヘルプ ファイル(*.chm)を作成している場合、そのファイルを作成したディレクトリから、そのファイルとそれに付随する *.xml ファイルをコピーする必要があります。 ArcCatalog または カタログ ウィンドウを使用して、各ファイルを、配布用ディレクトリ構造内にある esri/toolboxes ディレクトリにコピーします。esri ディレクトリとファイルの配置を以下に示します。
配布用の新しいディレクトリ構造は、以下のようになります。
これらの変更を配布に反映するには、setup.py ファイルを編集する必要があります。
setup.py のディレクトリの変更を含むサンプル コードを次に示します。
from distutils.core import setup
setup(name='foo',
version='1.0',
packages=['foo'],
package_dir={'foo': 'foo'},
package_data={'foo': ['esri/toolboxes/*.*']},
)
新しい setup.py と元の setup.py は、esri ディレクトリ内に存在するデータをパッケージに追加している 1 行が異なります。ここで、foo モジュール用のビルダを実行してインストールすると、以下のディレクトリ構造が、Python の site-packages ディレクトリに作成されます。
ArcGIS for Desktop と Python 配布ユーティリティ(Distutils)を使用してパッケージを構築およびインストールし、カスタム ツールボックス内のカスタム ツールによってジオプロセシングを拡張できます。これらのカスタム ツールは、ArcGIS システム ツールボックス内で表示して実行できます。英語での配布の場合、必要なプロセスは以上です。ローカライゼーションのトピックでは、ジオプロセシングの拡張プロセスを拡大して、Esri が使用するのと同じ手法を活用し、英語以外の言語で配布するためにモジュールをパッケージ化します。