Skip To Content

Crear tareas de geoprocesamiento con secuencias de comandos de Python

Explorar:

La mayoría de las herramientas de secuencias de comandos de Python que se ejecutan correctamente en su equipo se publicarán y ejecutarán correctamente en un Servidor SIG Server (no tiene que modificar su secuencia de comandos en modo alguno). Sin embargo, si está encontrando problemas, puede deberse a que la secuencia de comandos está utilizando muchos datos de proyecto o utilizando importar afirmaciones de Python para importar módulos que ha desarrollado. En este caso, este tema puede resultarle de ayuda, puesto que ahonda en los siguientes detalles:.

  1. Cómo se encuentran los datos de proyecto utilizados en una secuencia de comandos y se habilitan en el servidor para la ejecución de la tarea.
  2. Cómo se encuentran los módulos importados y se habilitan en el servidor para la ejecución de la tarea.
  3. Cómo crear datos de proyecto y los parámetros de los módulos Python para sus secuencias de comandos.
  4. Cómo se maneja un código de validación de la herramienta y su interacción entre el cliente y el servidor.
  5. Cómo se manejan las bibliotecas de terceros.

Si no está familiarizado con Python y ArcPy o las herramientas de secuencia de comandos, vaya a la sección Procedimientos iniciales con Python y ArcPy, y las herramientas de secuencia de comandos siguiente para obtener una lista de temas útiles.

Cómo se encuentran los datos de proyecto en la secuencia de comandos

Cada vez que comparten un resultado, ya sea como un paquete o como un servicio, y el resultado hace referencia a una herramienta de secuencia de comandos, la herramienta de secuencia de comandos se escanea para descubrir todos los datos de proyecto utilizados en la secuencia de comandos. Cuando los datos de proyecto se encuentran, se consolidada en una carpeta temporal que se empaqueta (si está compartiendo un paquete) o carga en el servidor (si está compartiendo un servicio).

Cuando la secuencia de comandos se escanea, todas las cadenas de caracteres citadas (con comillas simples o dobles) utilizadas en una variable de Python o como un argumento para una función se prueban para determinar si es una ruta de acceso a datos que existen. Datos, en este caso, significa

  • Una capa en la tabla de contenido (ArcMap o ArcGlobe)
  • Una carpeta
  • Un archivo
  • Un geodataset, como una clase de entidad, archivo de forma, geodatabase, documento de mapa (.mxd) y archivo de capa (.lyr)

Para los fines de debate, solo interesan los datos que se utilizan como entrada para las herramientas de geoprocesamiento o las rutas de acceso que hacen referencia a otros módulos de Python. Los datos de salida es también se consolidan, pero no se consideran datos de proyecto.

Siempre que una cadena de texto citado se encuentre en la secuencia de comandos, la prueba para la existencia de datos se lleva a cabo de la manera siguiente:

  1. ¿La cadena de caracteres hace referencia a una capa en la tabla de contenido?
  2. ¿La cadena de caracteres contiene una ruta absoluta a los datos (como " e: \Warehousing\ToolData\SanFrancisco. gdb\streets" )?
  3. ¿La cadena de caracteres tiene datos de referencia que se pueden encontrar en relación a la ubicación de la secuencia de comandos? La ubicación de la secuencia de comandos se define de la siguiente manera:

Estas pruebas se desarrollan en orden secuencial. Si la prueba pasa y existen los datos, se consolidarán, con una excepción: si va a compartir un servicio, el data store del servidor se examina para determinar si los datos se encuentran en el data store. Si reside en el almacenamiento de datos, entonces no está consolidada.

Nota:

Cuando las carpetas se consolidan, solo se copian los archivos y las geodatasets que están dentro de la carpeta; no se copia ninguna subcarpeta. Algunas geodatasets, como las geodatabases de archivos, rásteres y TINS son técnicamente carpetas, pero también son las geodatasets, así que se copiarán. Si la carpeta que contiene los archivos de capa (.lyr) o documentos de mapa (.mxd), todos los datos a los que se hace referencia en el archivo de capa o documento de mapa también se consolidan para que cualquier rutina de arcpy. mapping en la secuencia de comandos pueda obtener acceso a los datos a los que se hace referencia.

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 almacenamiento de datos del servidor, ya que no desea cargar estas carpetas en el servidor.)

Ejemplos

Los siguientes ejemplos se basan en esta estructura de carpetas:

Ejemplo carpeta del proyecto

Ejemplo carpeta del proyecto

Rutas relativas a los datasets

La siguiente técnica de búsqueda de datos relativos a la ubicación de la secuencia de comandos es un patrón común, especialmente para los servicios que se crearon para ArcGIS 10.0. La carpeta ToolData contiene SanFrancisco. gdb. En SanFrancisco. gdb hay una clase de entidad llamada Calles. En el siguiente código de ejemplo, la ruta de acceso a la carpeta ToolData y los datasets que contiene se generan en relación con la ubicación de la secuencia de comandos (el mismo directorio que el de Warehouse.tbx).


import arcpy
import os
import sys
# Get the directory the script lives in.
# Folders and data will be found relative to this location.
#
scriptPath = sys.path[0]
# Construct paths to ../ToolData/SanFrancisco.gdb/Streets and
#                    ../ToolData/Warehouse.lyr
streetFeatures = os.path.join(scriptPath, "ToolData\\SanFrancisco.gdb\\Streets")
streetLyr = os.path.join(scriptPath, "ToolData\\Warehouse.lyr")

En el código anterior, se probarán las variables streetFeatures y streetLyr para ver si hacen referencia a datos que existen. Estos datasets se consolidarán y se cargarán en el servidor (a menos que se haya hecho referencia a la carpeta donde se ubican como parte del data store del servidor).

Rutas relativas a carpetas

Se puede hacer referencia a la propia carpeta ToolData y utilizarla como punto de partida a los elementos referenciados. En el siguiente código de ejemplo, la ruta de acceso a la carpeta ToolData se genera en relación con la ubicación de la secuencia de comandos (el mismo directorio que el de Warehouse.tbx).


import arcpy import os import sys
# Get the directory the script lives in. # Folders and data will be found relative to this location. #
scriptPath = sys.path[0]
# Construct paths to the ToolData folder toolDataFolder = os.path.join(scriptPath, "ToolData")
# Construct path to items inside the folder streetFeatures = os.path.join(toolDataFolder, "SanFrancisco.gdb\\Streets")

En el código anterior, la variable toolDataFolder se convierte en una ruta relativa a una carpeta de varios elementos a los que se puede hacer referencia a través de la secuencia de comandos de Python. Esta carpeta ToolData será consolidada, todo su contenido (con la excepción de las subcarpetas como se describió anteriormente) se empaquetará o cargará en el servidor (a menos que la carpeta ToolData sea parte del almacenamiento de datos del servidor).

Tenga en cuenta que cuando se hace referencia a una carpeta se copia el contenido de la misma, no los archivos individuales. Por ejemplo, en el código anterior, a pesar de que no se ha creado una ruta explícita a Warehouse.lyr, el archivo se consolidará como si existiera en la carpeta referenciada.

Ruta absoluta para un geodataset

Una ruta absoluta comienza con la letra de unidad, como e:/, como se puede ver en la muestra de código que aparece a continuación.


import arcpy import os
streetFeatures = 'e:/Warehousing/ToolData/SanFrancisco.gdb/Streets'

En el código anterior, el dataset Calles, y todo el resto de datos de los que depende (como las clases de relación y dominios), se consolidarán.

Ejemplo de híbridos


import arcpy import os
toolDataPath = r'e:\Warehousing\ToolData' warehouseLyr = os.path.join(toolDataPath, "Warehouse.lyr")

En el código anterior, todo el contenido de la carpeta ToolData se consolida. Puesto que los contenidos de la carpeta (menos la subcarpetas) se consolidan, también se consolidará Warehouse.lyr junto con los datos referenciados por Almacén. lyr.

Referenciación de capas como datos de proyecto

Un flujo de trabajo no tan habitual de utilizar capas como datos de proyecto puede dar como resultado importantes mejoras del rendimiento de la herramienta de secuencia de comandos de Python. Los anteriores fragmentos de código de Python utilizan rutas completas a clases de entidad y archivos de capa. Cuando se ejecuta un servicio de geoprocesamiento, primero debe abrirse el dataset; la apertura del dataset es un éxito de rendimiento. Al utilizar capas en la secuencia de comandos, los datos se mantienen abiertos y en caché para que la ejecución sea más rápida. En la imagen siguiente se muestran cómo se emparejan y se utilizan en ArcMap las capas de la Tabla de contenido dentro de la secuencia de comandos de Python.

Capas utilizadas en la herramienta de secuencia de comandos de Python

Capas utilizadas en la herramienta de secuencia de comandos de Python

Las dos capas de la Tabla de contenido se utilizan dentro de la herramienta de secuencia de comandos. Las variables apuntan a cadenas de caracteres simples que coinciden con los nombres de las capas del documento de mapa. Cuando se publica este flujo de trabajo en ArcGIS Server, los datos se consolidan y se desplazan al servidor (si no están referenciados en el data store) y el servicio mantiene una referencia a las capas en la memoria. Dentro de ese servicio, la herramienta buscará y utilizará capas mediante esta coincidencia de nombres.

Nota:

Cuando se utilizan capas como datos de proyecto internos en una herramienta de secuencia de comandos, la herramienta de secuencia de comandos pasa a depender del documento de mapa asociado. No se puede ejecutar el herramienta de ArcCatalog ni de ningún otro documento de mapa sin que estas capas estén presentes. Este patrón no funciona con el procesamiento en segundo plano y reduce las probabilidades generales del flujo de trabajo. Por consiguiente, este patrón es el más adecuado para crear servicios de geoprocesamiento.

Barras diagonales frente a barras invertidas

La convención de Windows es utilizar una barra invertida (\) como separador de rutas. Los sistemas UNIX utilizan una barra diagonal (/).

Nota:

En ArcGIS, no importa si utiliza una barra diagonal o invertida en la ruta (ArcGIS siempre traduce las barras diagonales e invertidas a la convención del sistema operativo adecuado.

Barra invertida en secuencias de comandos

Los lenguajes de programación que tienen sus raíces en UNIX y el lenguaje de programación C, como Python, consideran la barra invertida (\) como el carácter de escape. Por ejemplo, \t significa una pestaña. Dado que las rutas pueden contener barras invertidas, debe evitar que las barras invertidas se utilicen como carácter de escape. La forma más sencilla de convertir rutas a cadenas de caracteres sin formato de Python es utilizar la directiva r, como se muestra a continuación. Esto da la orden a Python de ignorar las barras invertidas.

thePath = r"E:\data\telluride\newdata.gdb\slopes"

Más información acerca de la especificación de las rutas de acceso

Importar otros módulos de Python

La secuencia de comandos puede importar otras secuencias de comandos 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 la secuencia de comandos principal y contiene una rutina llamada getFIDName.


import arcpy
import myutils
inFeatures = arcpy.GetParameterAsText(0)
inFID = myutils.getFIDName(inFeatures)

Siempre que se encuentra una declaración import, se utiliza el siguiente orden para localizar la secuencia de comandos:

  • La misma carpeta que la secuencia de comandos. Si la secuencia de comandos está integrada en la caja de herramientas, la ubicación es la carpeta que contiene la caja de herramientas.
  • La carpeta del sistema al que hace referencia la variable PYTHONPATH .
  • Cualquier carpeta al que hace referencia a la la variable PATH del sistema.
Si se encuentra la secuencia de comandos para importar en alguna de estas carpetas, la secuencia de comandos se consolida. El proceso de escaneo es recursivo (la secuencia de comandos importada también se escanea en busca de datos de proyecto e importaciones utilizando todas las normas que se describen arriba.

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 las secuencias de comandos 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 myPythonModules

En el código anterior, tenga en cuenta que 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. El contenido de la carpeta para copiar las normas también se aplica en este caso (todo lo que haya en la carpeta se copia, excepto las subcarpetas que no son geodatasets).

Nota:

No se escanearán las secuencias de comandos Python dentro de la carpeta en busca de datos de proyecto o módulos importados.

Código de validación de la herramienta

Si tiene experiencia escribiendo las herramientas de secuencia de comandos, puede proporcionar su propia lógica de validación de la herramienta . Los clientes de servicio de geoprocesamiento no tienen la capacidad de ejecutar su lógica de validación de la herramienta, solamente el servidor tiene esta capacidad. Cuando el cliente envía sus solicitud ejecutar tarea al servicio, su lógica de validación se ejecutará en el servidor. Si las rutinas de validación lanzar un error, la tarea detiene la ejecución. Si devuelve mensajes desde su servicio, el cliente debe recibir mensajes enviados por su rutinas de validación.

La lógica de validación se implementa con Python y su código de validación se escaneará en buscas de datos de proyecto y módulos, al igual que cualquier otra secuencia de comandos de Python. Por ejemplo, su lógica de validación puede abrir una carpeta (como d:\approved_projections) que contiene archivos de proyección (.prj) para generar una lista de referencias espaciales que los clientes pueden utilizar cuando ejecutan la herramienta. Esta carpeta no es un parámetro de herramienta; son datos de proyecto que se utilizan en la validación de la herramienta de secuencia de comandos. Aquí se aplican las mismas normas que se describieron anteriormente para secuencias de comandos de Python, y la consecuencia es que la carpeta d:\approved_projections se consolidará y se copiará en el servidor (a menos que se encuentre en el data store del servidor).

Crear parámetros de las herramientas de datos de proyecto y módulos

Como se describió anteriormente, sus secuencias de comandos de Python se escanean cuando se comparten, y se toman las decisiones sobre qué datos utiliza la secuencia de comandos basándose en las cadenas de caracteres entrecomilladas encontradas en su código. Si desea tomar el control de este proceso, puede emplear la práctica de crear parámetros para todos los datos y módulos que utiliza la secuencia de comandos. El ejemplo de secuencia de comandos que aparece a continuación muestra idea (todos los datos de proyecto y módulos se convierten en parámetros que se incorporan en la secuencia de comandos.


import arcpy import sys import os
inFeatures = arcpy.GetParameterAsText(0)            # Feature Layer projectDataFolder = arcpy.GetParameterAsText(1)     # Folder myPythonModules = arcpy.GetParameterAsText(2)       # Folder
# Append the path to the utility modules to the system path
#  for the duration of this script. #
sys.path.append(myPythonModules) import myutils # a Python file within myPythonModules
# Construct a variable to hold the Streets feature class found in the
#  project data folder
#
streetsFeatures = os.path.join(projectDataFolder, "SanFrancisco.gdb", "Streets")

Cuando la secuencia de comandos utiliza parámetros para todos sus datos como se muestra arriba, tienen lugar diversos beneficios:

  • Usted es más conscientes de los datos que la secuencia de comandos necesita, puesto que al ser un parámetro, usted puede verlo en el cuadro de diálogo de la herramienta. No es necesario editar el código para determinar qué datos está utilizando.
  • La lógica de validación de la herramienta interna se hace cargo: si el el valor de parámetro hace referencia a datos que no existen, el cuadro de diálogo de la herramienta mostrará un error y no se podrá ejecutar la herramienta para crear un resultado.
  • Para restablecer la ubicación de los datos, puede buscar la ubicación mediante el cuadro de diálogo de la herramienta en lugar de introducir la ubicación de la secuencia de comandos (que es propenso a errores).
  • Cuando el resultado se comparte como un servicio, el Editor de servicio establecerá los parámetros de la carpeta en Modo de entrada de Constante; su cliente nunca ve los parámetros. Cuando publica, los dos carpetas se copiará en el servidor (si no están registradas con el almacenamiento de datos). Cuando se ejecuta la tarea en el servidor, su secuencia de comandos recibirá las rutas de acceso a la copia carpetas.

Módulos de otros fabricantes

Los módulos de terceros (cualquier módulo que no es parte del núcleo de instalación 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 los módulos numpy o matplotlib que están instaladas con ArcGIS for Server.

Nota:

La instalación módulos Python de terceros (que no sean numpy y matplotlib) en Linux requiere una gestión especial.

Más información sobre la instalación de módulos Python de terceros en Linux

Introducción a Python, ArcPy y las herramientas de secuencia de comandos

Si no está familiarizado con Python, Arcpy y las herramientas de secuencia de comandos, la tabla a continuación enumera algunos temas que le ayudarán a empezar.

Tema de ayudaÍndice

Un paseo introductorio por la creación de herramientas personalizadas

Conceptos básicos de crear sus propias herramientas de geoprocesamiento.

¿Qué es Python?

¿Qué es ArcPy?

Temas de introducción a Python y ArcPy. Estos temas le guiarán a temas más detallados sobre Python y el paquete del sitio de ArcPy.

Un rápido recorrido para crear herramientas con Python

¿Qué es una herramienta depreciada?

Tema introductoria sobre cómo crear herramientas de secuencia de comandos personalizadas mediante Python.

Configurar los parámetros de la herramienta de secuencia de comandos

Una vez que se haya familiarizado con el proceso de creación de una herramienta de secuencia de comandos, este tema se conoce porque a menudo explica en detalle cómo definir los parámetros de la herramienta de secuencia de comandos.

Temas relacionados