Empaquetar secuencias de comandos Python

Explorar:

La mayoría de las herramientas de secuencias de comandos Python que se ejecutan correctamente en su equipo se empaquetarán y ejecutarán correctamente al descomprimirlas en otro equipo (no tiene que modificar su secuencia de comandos en modo alguno). Sin embargo, si se producen problemas, puede deberse a que la secuencia de comandos está utilizando rutas de datos escritas en el código fuente o declaraciones import para importar los módulos de Python que ha desarrollado. En este caso, este tema puede resultarle útil, ya que profundiza en los siguientes detalles.

  1. Cómo se encuentran los datos escritos en el código fuente en una secuencia de comandos y se incluyen en un paquete.
  2. Cómo se encuentran y se incluyen en su paquete los módulos importados.
  3. Cómo se empaqueta el código de validación de la herramienta.
  4. Cómo se empaquetan las bibliotecas de terceros.

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

Cuando se comparte un resultado, ya sea como un paquete o como un servicio, y el resultado hace referencia a una herramienta de secuencia de comandos, esta herramienta se examina para descubrir todos los datos utilizados en la secuencia de comandos. Cuando se encuentra una ruta de datos, se consolida en una carpeta temporal que se incluye en el paquete.

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 de mapa
  • Una carpeta
  • Un archivo
  • Un geodataset, como una clase de entidad, un shapefile, una geodatabase o un archivo de capa

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 también se consolidan.

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 de mapa?
  2. ¿Contiene la cadena de caracteres 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:
    • La carpeta que contiene 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.
    • Si la secuencia de comandos se encuentra en una caja de herramientas Python la ubicación es la carpeta que contiene la caja de herramientas Python.

Estas pruebas se desarrollan en orden secuencial. Si se supera la prueba y existen los datos, se consolidarán.

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 contiene archivos de capa, todos los datos a los que haga referencia el archivo de capa se consolidarán también para que las rutinas arcpy.mp de la secuencia de comandos puedan tener acceso a los datos referenciados.

Sugerencia:

Debido a la forma en que las carpetas se consolidan, debe evitar llenar 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.

Ejemplos

Los siguientes ejemplos se basan en esta estructura de carpetas:

Ejemplo carpeta del proyecto
Ejemplo carpeta del proyecto

Rutas relativas y carpetas

La siguiente técnica de búsqueda de datos en función de la ubicación de la secuencia de comandos es un patrón común. A modo de referencia, el siguiente código residen en la carpeta secuencia de comandos que se ilustró anteriormente. La carpeta ToolData contiene SanFrancisco.gdb. Dentro de SanFrancisco.gdb hay una clase de entidad llamada Streets. En la siguiente muestra de código, la ruta a la carpeta ToolData se construye en relación a la ubicación de la secuencia de comandos (la carpeta Secuencias de comandos ).


import arcpy
import os
import sys
# Get the pathname to this script, then strip off the
#  script file name to yield the containing folder
#
scriptPath = sys.path[0]
thisFolder = os.path.dirname(scriptPath)
# Construct paths to ../ToolData/SanFrancisco.gdb/Streets and
#                    ../ToolData/Warehouse.lyr
#
toolDataPath = os.path.join(thisFolder, "ToolData")
streetFeatures = os.path.join(toolDataPath, "SanFrancisco.gdb", "Streets")
streetLyr = os.path.join(toolDataPath, "Warehouse.lyr")

En el código anterior, la cadena de caracteres "ToolData" (un argumento de la función os.path.join) se prueba para ver si existe. En este caso, hay una carpeta llamada ToolData en relación a la ubicación de la secuencia de comandos. Esta carpeta ToolData se consolidará: todo su contenido (con la excepción de las subcarpetas, como ya se ha indicado) se empaquetará.

Observe que se copian los contenidos de la carpeta, no los archivos individuales. Por ejemplo, en el código anterior, se construye la ruta al dataset e:/Warehousing/ToolData/SanFrancisco.gdb/Streets. El proceso de consolidación no se aísla y solo copia el dataset Calles dataset (copia toda la carpeta ToolData).

Ruta absoluta para un geodataset

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


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


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

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

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"

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, 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. Dado que ': \Warehousing\Script' es una carpeta, todo el contenido de la carpeta se consolidará. 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 . 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 usuarios pueden elegir cuando ejecutan la herramienta. Esta carpeta no es un parámetro de herramienta; es simplemente una ruta de datos que se utiliza en la secuencia de comandos de validación de la herramienta. Las mismas reglas que se describieron anteriormente para las secuencias de comandos de Python se aplican aquí, y la consecuencia es que la carpeta d:\approved_projections se consolidará y se incluirá en el paquete.

Bibliotecas de terceros

Los módulos de terceros (cualquier módulo que no es parte del núcleo de instalación de Python) no se consolidan. Tiene que asegurarse de que el módulo está instalado en el equipo donde se abra el empaquetado. Debe proporcionar documentación para la herramienta y paquetes que especifiquen qué módulos de terceros son necesarios. Esto no tiene validez para los módulos de terceros que se instalan con ArcGIS, incluidos numpy, matplotlib y pandas, entre otros.