Python 配布ユーティリティ (Distutils) を使用すると、モデルやスクリプト ツールを含む Python ツールボックスとカスタム ツールボックスを Python モジュールの形式で効率よく ArcGIS ユーザーに配布できます。これらのツールボックスを構築して配布するプロセスは、Python モジュールの作成から始まります。この例で使用するモジュールは、foo.py です。
foo.py
foo Python モジュールを作成するサンプル コードを次に示します。
import os
def hello():
print('Hello ' + os.getenv('username'))
モジュールを正しく構築して配布するには、特定のディレクトリ構造が存在する必要があります。foo というディレクトリを作成し、foo モジュールを格納する必要があります。配布するには、foo モジュールが格納されたディレクトリが親ディレクトリ内に存在する必要があります。そのため、src というディレクトリを作成し、foo ディレクトリおよび foo モジュールをそこに格納します。ディレクトリ構造は、以下のようになります。

foo モジュールをインポートしたときに、特定のコードを初期化して自動的に実行するには、__init__.p ファイルが必要になります。__init__ を所定の場所に配置することで、ユーザーは foo モジュールにアクセスし、選択した定義をインポートできるようになります。
__init__.py
foo 用の __init__.py を作成するサンプル コードを次に示します。
from foo import hello
ここで、ディレクトリ構造は、以下のようになります。

ファイルおよびディレクトリ構造を所定の場所に配置することで、import foo を使用して foo モジュールをインポートし、foo.hello() を呼び出して実行できるようになります。次のステップは、foo モジュールの配布パッケージを構築することです。これにより、モジュールを Python のサイトパッケージ ディレクトリにインストールして簡単に共有することができます。setup.py スクリプトを記述することによって、これを実行できます。
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 上で構築します。
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 のサイトパッケージ ディレクトリにインストールするために配布できる、実行可能ファイルです。実行可能ファイルを実行して foo モジュールをインストールする代わりに、foo ディレクトリを、build/lib ディレクトリから Python の サイトパッケージ ディレクトリに直接コピーすることもできます。実行可能ファイルの実行を禁止するユーザー制約が存在する場合、foo ディレクトリを build/lib ディレクトリからサイトパッケージ ディレクトリにコピーすることは、実行可能ファイルを使用してインストールするのと同じ効果があります。foo モジュールをサイトパッケージ ディレクトリにインストールまたはコピーすると、ディレクトリ構造は以下のようになります。

このプロセスをさらに実行し、カスタム ツールボックスや Python ツールボックスを ArcGIS システム ツールボックスに直接追加することによって、ジオプロセシング機能を拡張できます。これらのツールボックスは、システム ツールボックスとして ArcGIS 内のシステム ツールボックスのリストから簡単にアクセスできるようになります。ArcPy を拡張するための ArcPy ラッパーを作成することもできます。さらに、カスタム ツールボックス モジュールは、ArcGIS システム ツールボックスで十分に確立されている手法を活用して、メッセージの配布、言語ベースのヘルプ、ローカライズされた設定に対応できます。ArcGIS Desktop は、Python のサイトパッケージの場所を検索して、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] ツールボックスの作成および動作に関する詳細は、「新しい Python ツールボックスの作成」をご参照ください。
SamplePythonToolbox.pyt
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
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 のサイトパッケージ ディレクトリに作成されます。

ArcGIS Desktop と Python 配布ユーティリティ (Distutils) を使用すると、パッケージを構築してインストールし、カスタム ツールボックス内のカスタム ツールでジオプロセシングを拡張できます。これらのカスタム ツールは、ArcGIS システム ツールボックス内で表示して実行できます。英語での配布の場合、必要なプロセスは以上です。ローカライゼーションのトピックでは、Esri が使用している手法と同じ手法を活用して、英語以外の言語で配布するためにモジュールをパッケージ化するジオプロセシングの拡張プロセスについて詳しく説明しています。