Python モジュールによるジオプロセシングの拡張

Python 配布ユーティリティ(Distutils)および Python のドキュメント「Distributing Python Modules」に記載された情報を使用して、モデルやスクリプト ツールを含む 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__.py ファイルが必要になります。__init__.py を所定の場所に配置することで、ユーザは foo モジュールにアクセスし、選択した定義をインポートできるようになります。

__init__.py

foo 用の __init__.py を作成するサンプル コードを次に示します。

from foo import hello

ここで、ディレクトリ構造は、以下のようになります。

代替テキストが必要

各ファイルを所定のディレクトリ構造に配置することで、import foo を使用して foo モジュールをインポートし、foo.hello() を呼び出して実行できるようになります。次のステップは、foo モジュールの配布パッケージを構築することです。これにより、モジュールを Python の site-packages ディレクトリにインストールして簡単に共有することができます。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 上で構築します。

注意注意:

必ず、使用しているシステム上で 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 ツールボックスのエイリアスを設定することは重要です。

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 の site-packages ディレクトリに作成されます。

代替テキストが必要

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

関連トピック

5/10/2014