Al utilizar Python Distribution Utilities (distutils), 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. Se debe crear un directorio con el nombre foo para almacenar 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:

Para que el módulo foo se inicialice y ejecute automáticamente un código dado una vez que se haya importado, requiere 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:

Con los archivos y la estructura de directorios disponibles, el módulo foo se puede importar a través de import foo y se puede ejecutar foo.hello(). El paso siguiente es crear un paquete de distribución para que el módulo foo se pueda instalar en el directorio site-packages de Python con el fin de compartirlo 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 se debe guardar en el directorio src. En este punto, la estructura del directorio debe ser la siguiente:

Con la estructura de directorios disponible, se puede crear un instalador para el módulo foo ejecutando uno de los comandos siguientes desde el directorio src con la ventana de comandos del sistema operativo correspondiente. Este ejemplo se crea en el 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 site-packages de Python 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:

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 la caja de herramientas personalizada puede aprovechar la metodología sólidamente establecida de las cajas de herramientas del sistema de ArcGIS para la distribución de mensajes, la ayuda basada en idiomas y la respuesta a las configuraciones localizadas. ArcGIS 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 los archivos de ayuda correspondientes. La siguiente es la estructura del directorio para el idioma inglés:

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 cómo crear y utilizar cajas de herramientas de Python, consulte Crear una nueva caja de herramientas Python.
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 que 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 los archivos .xml correspondientes se deben copiar desde el directorio en el que se crearon. Utilizando ArcCatalog o la ventana Catálogo, copie los archivos en el directorio esri/toolboxes que exista en la estructura de distribución. La estructura del directorio esri y los archivos debe ser la siguiente:

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

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 crea la siguiente estructura de directorios en el directorio site-packages de Python:

Al utilizar ArcGIS 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 el proceso de ampliar el geoprocesamiento para utilizar la misma metodología que se utiliza en Esri para empaquetar el módulo que se distribuirá en idiomas que no sean inglés.