Ampliar el geoprocesamiento mediante módulos de Python

Al utilizar Python Distribution Utilities (Distutils) y la información que recoge la documentación de Python, Distribuir módulos de Python, las cajas de herramientas y las cajas de herramientas personalizadas de Python que contienen modelos o herramientas de secuencias de comandos pueden distribuirse de manera eficaz a los usuarios de ArcGIS en forma de módulos de Python. El proceso de creación y distribución de estas cajas de herramientas comienza con la creación del módulo Python. El módulo utilizado en este ejemplo será foo.py.

foo.py

El código de muestra para crear el módulo foo de Python:

import os

def hello():
    print 'Hello ' + os.getenv('username')

Para que el módulo se cree y distribuya correctamente, debe existir una estructura de directorio específica. Debe crearse un directorio con el nombre foo para guardar el módulo foo. Puesto que la distribución exige que el directorio que almacene el módulo foo se incluya en un directorio principal, se crea un directorio llamado src para alojar el directorio foo y el módulo foo. La estructura del directorio debe ser la siguiente:

Texto alternativo obligatorio

Para que el módulo foo se inicialice y ejecute automáticamente un código dado una vez que se haya importado, exige un archivo __init__.py. Con __init__.py disponible, los usuarios podrán acceder al módulo foo e importar las definiciones seleccionadas.

__init__.py

El código de muestra para crear el módulo __init__.py para foo:

from foo import hello

La estructura del directorio ahora debe ser la siguiente:

Texto alternativo obligatorio

Con la disponibilidad de estos archivos y de la estructura de directorio, el módulo foo puede importarse mediante import foo y foo.hello() puede llamarse y ejecutarse. El paso siguiente es crear un paquete de distribución para que el módulo foo pueda instalarse en el directorio site-packages de Python y de esa manera se comparta fácilmente. Esto se lleva a cabo elaborando una secuencia de comandos setup.py.

setup.py

El código de muestra para crear setup.py:

from distutils.core import setup
setup(name='foo',
    version='1.0',
    packages=['foo'],
    package_dir={'foo': 'foo'},
    )

El archivo setup.py define el nombre y la versión del módulo, y dirige la utilidad de construcción al directorio de paquetes. El archivo setup.py debe guardarse en el directorio src. En este punto, la estructura del directorio debe ser la siguiente:

Texto alternativo obligatorio

Con la disponibilidad de la estructura de directorio, se puede crear un instalador para el módulo foo ejecutando uno de los comandos siguientes dentro del directorio src con la ventana de comando del sistema operativo correspondiente. Este ejemplo se crea en el sistema operativo Windows.

NotaNota:

Asegúrese de que la ruta a python.exe esté establecida en el sistema. En el sistema operativo Windows, esto se puede hacer agregando C:\Python27\ArcGIS10.2 a la variable de ruta del sistema en las variables del entorno del sistema operativo Windows.

Windows:

python setup.py bdist_wininst

Linux:

python setup.py bdist_rpm

El builder de Windows crea los directorios dist y build en el directorio src. En el directorio dist, se crea foo-1.0.win32.exe. Es un archivo ejecutable que se puede distribuir para instalar el módulo foo en el directorio Python site-packages en un equipo Windows. Como alternativa a ejecutar el archivo ejecutable para instalar el módulo foo, el directorio foo también se puede copiar directamente desde el directorio build/lib en el directorio site-packages de Python. Si hay restricciones de usuarios que prohíben la ejecución de un archivo ejecutable, copiar el directorio foo desde el directorio build/lib en el directorio site-packages producirá el mismo efecto que instalarlo mediante el archivo ejecutable. Una vez que el módulo foo se haya instalado o copiado en el directorio site-packages, la estructura debe ser la siguiente:

Texto alternativo obligatorio

Este proceso se puede implantar adicionalmente para ampliar las funciones de geoprocesamiento agregando cajas de herramientas personalizadas o cajas de herramientas de Python directamente en las cajas de herramientas del sistema ArcGIS. Como caja de herramientas del sistema, estará disponible de inmediato en la lista de cajas de herramientas del sistema de ArcGIS y también podrán crearse contenedores ArcPy para ampliar ArcPy. Además, de esta manera el módulo de caja de herramientas personalizadas puede aprovechar la metodología sólidamente establecida de las cajas de herramientas del sistema ArcGIS para la distribución de mensajes, la ayuda en idiomas y la respuesta a las configuraciones localizadas. ArcGIS for Desktop buscará en la ubicación site-packages de Python para comprobar si existe un directorio llamado esri dentro de cada módulo. El directorio esri contiene las cajas de herramientas personalizadas así como sus archivos de ayuda correspondientes. La siguiente es la estructura del directorio para el idioma inglés:

Texto alternativo obligatorio

Las cajas de herramientas personalizadas (.tbx y .pyt) se colocan en el directorio esri/toolboxes junto con las secuencias de comandos complementarias si se utilizan herramientas de secuencias de comandos. El directorio esri/help/gp es el lugar donde se almacenan los metadatos de cajas de herramientas y herramientas (.xml) para las cajas de herramientas y las herramientas personalizadas. La convención de nombre para la caja de herramientas es <toolbox alias>_toolbox.xml y la convención de nombre para cada herramienta es <toolname>_<toolbox alias>.xml. El directorio esri/help/gp/messages es el lugar donde se colocan los archivos de mensajes de geoprocesamiento (.xml). Estos archivos de mensajes se utilizan en las cajas de herramientas de Python para los mensajes que necesitan ser internacionalizados. Las categorías de cajas de herramientas y herramientas sustituyen a los archivos situados en el directorio esri/help/gp/toolboxes. Mediante la creación de una caja de herramientas de Python llamada SamplePythonToolbox, es posible demostrar el proceso de ampliar el geoprocesamiento mediante módulos Python en su totalidad. Para obtener información adicional sobre la creación y el trabajo con las cajas de herramientas de Python, consulte http://resources.arcgis.com/en/help/main/10.1/index.html#//001500000034000000.

NotaNota:

Es importante definir un alias en la caja de herramientas de Python que se utilizará en este proceso.

SamplePythonToolbox.pyt

Código de muestra para crear una caja de herramientas de 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

En SamplePythonToolbox.pyt, se importa el módulo foo y el método de ejecución de la clase SampleTool llama a la función hello desde el módulo foo. Es una forma eficaz de distribuir códigos Python personalizados como módulos y de exponer sus funciones mediante las herramientas de geoprocesamiento de ArcGIS. Una vez que se ha creado SamplePythonToolbox.pyt y se ha configurado la ayuda del panel lateral para la caja de herramientas mediante los metadatos editados en el menú contextual Descripción del elemento o se ha creado un archivo de ayuda compilado de forma personalizada (.chm), este y sus correspondientes archivos .xml deberán copiarse desde el directorio en el cual se creó. Utilizando ArcCatalog o la ventana Catálogo, copie los archivos en el directorio esri/toolboxes que exista en la estructura de distribución. El diseño del directorio y archivos esri debe ser la siguiente:

Texto alternativo obligatorio

La nueva estructura de directorio para la distribución debe ser la siguiente:

Texto alternativo obligatorio

Para que los cambios se reflejen en nuestra distribución, debe editarse el archivo setup.py.

El nuevo setup.py

Código de muestra que debe incluir los cambios del directorio setup.py:

from distutils.core import setup
setup(name='foo',
    version='1.0',
    packages=['foo'],
    package_dir={'foo': 'foo'},
    package_data={'foo': ['esri/toolboxes/*.*']},
    )

El nuevo setup.py difiere del original en una línea en la que los datos adicionales que se encuentran en el directorio esri se agregan al paquete. Ahora, cuando se ejecuta e instala el builder del módulo foo, se creará la siguiente estructura de directorio en el directorio site-packages de Python:

Texto alternativo obligatorio

Al utilizar ArcGIS for Desktop y Python Distribution Utilities (Distutils), es posible crear e instalar un paquete que amplíe el geoprocesamiento con herramientas personalizadas en cajas de herramientas personalizadas que pueden consultarse y ejecutarse desde las cajas de herramientas del sistema ArcGIS. Para las distribuciones en inglés, esto es lo único que se necesita. El tema Internacionalización se amplía con el proceso de ampliar el geoprocesamiento para utilizar la misma metodología empleada por Esri para empaquetar el módulo que se distribuirá en idiomas que no sean inglés.

Temas relacionados

5/9/2014