La mayoría de las herramientas de script de Python que se ejecutan correctamente en su equipo se publicarán y ejecutarán correctamente como una herramienta web en ArcGIS Enterprise o un servicio de geoprocesamiento en un ArcGIS Server independiente (no tiene que modificar el script).
Construir rutas a datos de proyecto
Una parte importante de muchos scripts de Python es la correcta construcción de las rutas que hacen referencia a los datos. Esto incluye los datos de proyecto (datos de entrada no expuestos como un parámetro de herramienta) dentro de scripts y datos intermedios (temporales). En Python, hay distintas formas de escribir rutas que hagan referencia a los datos. Consulte Establecer rutas de acceso a datos en Python para obtener información detallada sobre el procedimiento para escribir una ruta completa.
Una ruta de datos relativa a una ubicación conocida se puede crear usando os.path.join. Esto también resulta útil para crear rutas de ubicaciones de salida que residan en el espacio de trabajo de la memoria o para usar ubicaciones temporales para los datos temporales en el disco. Consulte el ejemplo siguiente con os.path.join.
Cuando comparte una herramienta como una herramienta web, se examina el script y todas las cadenas de caracteres (con comillas simples o dobles) utilizadas en una variable de Python o como argumento de una función se prueban para determinar si se trata de una ruta a datos existentes. En este caso, los datos de proyecto incluyen cualquiera de los siguientes:
- Una capa en la tabla de contenido de un mapa o escena
- Una carpeta
- Un archivo
- Un geodataset, como una clase de entidad, una geodatabase, un mapa (.mapx) o un archivo de capa (.lyrx).
Cuando se encuentra una cadena de caracteres en el script, la prueba para comprobar la existencia de datos responde a las siguientes preguntas:
- ¿La cadena de caracteres hace referencia a una capa del panel Contenido?
- ¿Contiene la cadena de caracteres una ruta absoluta a los datos (como "e:\Warehousing\ToolData\SanFrancisco.gdb\streets")?
- ¿La cadena de caracteres hace referencia a datos que se pueden encontrar en una ubicación relativa a otra conocida, como el archivo de proyecto .aprx o el script?
Estas pruebas se desarrollan en orden secuencial. Si se supera la prueba y existen los datos, se consolidarán, con una excepción: si los datos se han registrado en el data store federado del portal, no se consolidarán.
Nota:
Cuando las carpetas se consolidan, solo se copian los archivos y las geodatasets que están en la carpeta; no se copia ninguna subcarpeta. Algunos geodatasets, como las geodatabases de archivos y los rásteres, son técnicamente carpetas, pero también son geodatasets, de modo que se copiarán. Si la carpeta contiene archivos de capa (.lyrx) o mapas (.mapx), todos los datos referenciados por el archivo de capa o el mapa se consolidan también para que las rutinas de arcpy.mp en el script puedan tener acceso a los datos referenciados.
Sugerencia:
Debido a la forma en que las carpetas se consolidan, debe evitar abarrotar la carpeta con datasets grandes y archivos que nunca serán utilizados por la herramienta; esto aumenta innecesariamente el tamaño de los datos que se empaquetarán o cargaran en el servidor. (Esto no se aplica a las carpetas que se encuentran en un data store del servidor, ya que estas carpetas no se cargan en el servidor).
Ejemplo
El siguiente ejemplo se basa en esta estructura de carpetas de proyecto:

Rutas relativas a datasets y carpetas
Una rutina de arcpy.mp le permite obtener la homeFolder o defaultGeodatabase para un proyecto determinado. Las rutas se pueden crear usando el módulo de os de Python. En el siguiente ejemplo, se define una clase de entidad en la geodatabase WebTools.gdb y se simboliza usando un archivo de capa de la carpeta LYRXs:
import arcpy
import os
# The ArcGIS Project is used to build paths from the defaultGeodatabase and
# homeFolder using os.path.join
# Reference the CURRENT project with ArcGIS Pro open, or point to an .aprx on
# disk
prj = arcpy.mp.ArcGISProject("CURRENT")
arcpy.management.CopyFeatures(os.path.join(prj.defaultGeodatabase, "study_sites"),
"memory/tempSite")
# Create a variable to reference the LYRX folder
lyrxFolder = os.path.join(prj.homeFolder, "LYRXs")
arcpy.management.ApplySymbologyFromLayer("memory/tempSite",
os.path.join(lyrxFolder, "Site4.lyrx"))
En el código anterior, la clase de entidad study_sites y el archivo Site4.lyrx (y los datos a los que señala) se probarán para ver si hacen referencia a datos existentes. Estos datasets se consolidarán y se cargarán en el servidor (a menos que se haya hecho referencia a la carpeta donde residen como parte del data store del servidor).
La variable lyrxFolder hace referencia a la ruta relativa de una carpeta o de archivos de capa. Esta carpeta se consolidará; todo su contenido (con la excepción de las subcarpetas, como ya se ha indicado) se empaquetará o cargará en el servidor (a menos que la carpeta lyrxFolder forme parte del data store del servidor).
Referencia a capas como datos de proyecto
Un flujo de trabajo menos habitual consistente en utilizar capas como datos de proyecto puede dar como resultado importantes mejoras del rendimiento de una herramienta de script de Python. El código de Python anterior utiliza rutas completas a clases de entidad y archivos de capa. Cuando se ejecuta una herramienta web, primero debe abrir el dataset, operación que tiene un coste en términos de rendimiento. Al utilizar capas en un script, los datos se mantendrán abiertos y en caché para que la implementación sea más rápida. En la imagen siguiente se muestra cómo se establece la correspondencia de las capas del contenido del proyecto y cómo se usan dichas capas en el script de Python:

Las variables (extentMask y rasterLayer) apuntan a cadenas de caracteres simples que coinciden con los nombres de las capas del mapa. Los datos se consolidarán y estarán disponibles en la herramienta web cuando se comparten con el portal (si no están referenciados en el data store) y se conservará una referencia a las capas en la memoria. Esta correspondencia de nombres entre las capas del mapa y las cadenas de caracteres de un script permite que las herramientas funcionen con las capas.
Nota:
Cuando se utilizan capas como datos de proyecto internos en una herramienta de script, esta pasa a depender del mapa asociado. No se puede ejecutar la herramienta desde otro mapa sin que estas capas estén presentes. Este patrón reduce la portabilidad general de una herramienta de script, por lo que este patrón es más adecuado para crear herramientas web.
Importar otros módulos de Python
Un script puede importar otros scripts que haya desarrollado. Por ejemplo, el código que aparece a continuación muestra cómo importar un módulo de Python denominado myutils.py, que se encuentra en el mismo directorio que el script principal e incluye un método denominado getFIDName:
import arcpy
import myutils
inFeatures = arcpy.GetParameterAsText(0)
inFID = myutils.getFIDName(inFeatures)Cuando se encuentra una sentencia import, se utiliza el siguiente orden para ubicar el script:
- La misma carpeta que el script. Si el script está integrado en la caja de herramientas, la ubicación es la carpeta que contiene la caja de herramientas.
- La carpeta a la que hace referencia la variable del sistema PYTHONPATH.
- Cualquier carpeta a la que hace referencia la variable del sistema PATH.
Otra técnica para hacer referencia a los módulos que se van a importar es utilizar el método sys.path.append. Esto le permite establecer una ruta a una carpeta que contiene los scripts que necesita importar.
import arcpy
import sys
import os
# Append the path to the utility modules to the system path
# for the duration of this script.
myPythonModules = r'e:\Warehousing\Scripts'
sys.path.append(myPythonModules)
import myutils # A Python file within myPythonModulesEn el código anterior, el método sys.path.append requiere una carpeta como argumento. Como r'e:\Warehousing\Scripts' es una carpeta, se consolidará todo el contenido de dicha carpeta. Las reglas para copiar el contenido de la carpeta se aplican también en este caso: se copia todo lo que hay en la carpeta, excepto las subcarpetas que no son geodatasets.
Nota:
No se examinarán los scripts de Python de la carpeta en busca de datos de proyecto o módulos importados.
Módulos de otros fabricantes
Los módulos y las bibliotecas de terceros (cualquier módulo que no forme parte de la instalación básica de Python) no se consolidan. Es necesario garantizar que el módulo existe y se ejecuta correctamente en el servidor. Esto no se aplica a numpy, matplotlib ni otros módulos instalados con su servidor federado que ejecuta ArcGIS Server de forma predeterminada. Para implementar módulos de Python de terceros, consulte Implementar paquetes de Python personalizados para ArcGIS Server.
Código de validación de la herramienta
Las herramientas de script admiten una lógica de validación de herramientas personalizada. La validación admite comportamientos como habilitar y deshabilitar parámetros, proporcionar valores predeterminados y actualizar palabras clave de cadena de caracteres. Sin la funcionalidad de validación, la lógica de validación de herramientas personalizadas no aporta mucho valor a los clientes de herramientas web. Sin embargo, con la funcionalidad de validación, los clientes pueden tener una experiencia de validación similar ejecutando una herramienta web en comparación con la ejecución local de la herramienta.
Capacidad de validación
Cuando un cliente envía una solicitud de validación a una herramienta web o a un servicio de geoprocesamiento, se ejecuta la clase ToolValidator. Para garantizar una mejor experiencia a los usuarios de su herramienta, solo escriba código de validación de procesamiento rápido. Aunque se puede utilizar código de validación que abra un dataset o cambie un valor o esquema de una entrada de entidad o tabla, la validación será lenta y no devolverá la entidad o tabla modificada al usuario de la herramienta web.
Las siguientes validaciones personalizadas de uso frecuente están totalmente admitidas por la funcionalidad de validación. Python también admite otras funcionalidades de validación, excepto el cambio del valor de una entidad de entrada, tabla o ráster.
En función del valor de un parámetro, se actualizará el filtro de otro parámetro.
def updateParameters(self):
if self.params[0].value < 1000:
self.params[1].filter.list = ["A4", "Letter"]
elif self.params[0].value < 5000:
self.params[1].filter.list = ["A3", "Tabloid"]
else:
self.params[1].filter.list = ["A2", "ANSI C"]
returnSi el primer parámetro tiene un valor, se habilitará el segundo; en caso contrario, se deshabilitará.
def updateParameters(self):
if self.params[0].value:
self.params[1].enabled = True
else:
self.params[1].enabled = False
returnSi un usuario no ha proporcionado un valor al parámetro, el código de validación actualizará el valor del parámetro a una cadena de caracteres especificada.
def updateParameters(self):
if not self.params[3].altered:
self.params[3].value = "Default map authored by " + self.params[2].valueAsText
returnSe proporcionará un mensaje en función del tipo de geometría de la entrada.
def updateMessages(self):
self.params[0].clearMessage()
if self.params[0].valueAsText:
shapetype = arcpy.Describe(self.params[0]).shapeType.lower()
if shapetype == "point":
self.params[0].setWarningMessage("Choosing a point layer may result long running time of the tool.")
elif shapetype == "polygon":
self.params[0].setErrorMessage("Polygon inputs are not supported temporarily.")
returnEstas configuraciones en la función de initializeParameters afectarán a la herramienta cuando se publique o cuando se reinicie el servicio de geoprocesamiento.
def initializeParameters(self):
self.params[5].parameterDependencies = [4]
self.params[7].category = "Detailed configurations"
returnLos clientes de las herramientas web no pueden ejecutar la lógica de validación de una herramienta, solo el servidor tiene esta funcionalidad. Cuando el cliente envía su solicitud de ejecución de tarea al servicio, la lógica de validación se ejecutará en el servidor. Si la validación genera un error, la tarea se detendrá. Si devuelve mensajes desde su servicio, el cliente no recibirá mensajes enviados de sus rutinas de validación. Generalmente, el código de validación de la herramienta integrado en una herramienta web publicada proporciona menos valor que el que proporcionó a la herramienta cuando se utilizó en Desktop. Puede trabajar con una copia de una herramienta web que tenga el código de validación reducido o eliminado y compartir esa copia como herramienta web. Debe desarrollar la lógica de validación en la aplicación para consumir la herramienta web.
La lógica de validación se implementa con Python y el código de validación se examinará en busca de datos de proyecto y módulos, al igual que en cualquier otro script de Python. Por ejemplo, la lógica de validación puede abrir una carpeta si ésta no es un parámetro de herramienta; son datos de proyecto que se utilizan en el script de validación de la herramienta. Aquí se aplican las mismas reglas que se describieron anteriormente para scripts de Python y la carpeta c se consolidará y se copiará en el servidor (a menos que se encuentre en el data store del servidor).
Introducción a Python, ArcPy y las herramientas de script
Si no está familiarizado con Python, ArcPy ni las herramientas de script, la siguiente tabla enumera algunos temas que le ayudarán a empezar:
| Tema de ayuda | Contenido |
|---|---|
Temas de introducción al geoprocesamiento. | |
Temas de introducción a ArcPy. | |
Temas introductorios sobre cómo crear herramientas de script personalizadas con Python. | |
Una vez que se haya familiarizado con el proceso de creación de una herramienta de secuencia de comandos, este tema explica en detalle cómo definir los parámetros de la herramienta de secuencia de comandos. |