5 votos

¿Es posible agregar scripts de Python util como bibliotecas compartidas a la caja de herramientas de geoprocesamiento esri?

Hemos GP herramientas en el GP caja de herramientas OurServices.tbx y algunos de ellos están escritos en Python. Podemos acceder a ellos a través de los servicios de geoprocesamiento. Sin embargo, algunas funciones Python son sólo copia-pega de un GP de la función de escritura a otro.

La pregunta es: ¿Es posible insertar una secuencia de comandos de Python, dicen our_utils.py en el cuadro de herramientas de archivo (tbx) por lo que en todos nuestros Python herramientas que son capaces de acceder a las funciones comunes como este:

import our_utils
our_utils.sharedFunc()

No queremos paquete de funciones compartidas como independiente GP de herramientas y, a continuación, utilizar ModelBuilder; este enfoque es demasiado pesado para el problema.

Recompensa edición 1 (2015-05-05)

Siento que tengo que dar una recompensa a alguien que participan aquí. Al menos tres hermosas mentes fueron atraídos por ella así que no quiero que mi recompensa va a polvo.

No tengo ArcGIS en mis huellas dactilares en el momento, pero he pasado de 30 a 40 minutos hoy la comprobación de si @mr.adams hacks puede ser extendido a las instalaciones de servidor (de geoprocesamiento resto de servicios). Y, sorprendentemente, funcionó con algunos adicionales hacks!

Las modificaciones fueron: después del envasado .archivo sd (que sigue siendo un misterio para mí cómo pack de más de una herramienta) cambiar el nombre de ese archivo .zip y agregar carpetas de las bibliotecas (importación mylib => debe agregar mylib carpeta en zip). A continuación, cambie el nombre .cremallera de la espalda .sd.

Así que mi modesta recompensa va a @mr.adams. No voy a marcar su respuesta como verdadera respuesta; todavía tengo que encontrar una manera más sencilla.

Por pura Pythonistas @Farid_Cher dio una excelente .pyt plantilla. Espero que muchos copypasters va a usar.

2voto

HeretoLearn Puntos 118

Cuando usted dice que la incrustación, estoy suponiendo que te refieres a este enfoque? http://resources.arcgis.com/en/help/main/10.2/index.html#//005700000017000000

Si es así, la respuesta corta es no.

La incrustación de secuencias de comandos es una buena manera de minimizar el número de archivos que tiene que pasar, o simplemente para ocultar y cifrar su trabajo. Usted podría incrustar sus utilidades mientras sus funciones de utilidad son incluidos en una de las herramienta de la fuente de secuencias de comandos.

Sin embargo, incrustado '.py' es ahora parte de la caja de herramientas, y el de Python de importación no se puede mirar en la caja de herramientas para encontrarlo.

2voto

Brett Allen Puntos 231

En el pasado he tenido que distribuir una caja de herramientas (.tbx) con muchas herramientas, cada uno con su propio guión, pero muchos de los que comparten las mismas funciones. Creo que este es el mismo problema que usted está tratando. En mi caso he resuelto la cuestión de los paquetes con esta estructura de archivos:

top_folder/
    tools.tbx
    scripts/
        tool1.py
            module_name/
                __init__.py
                general.py
                    (inside of this file)
                    def upper_case(string):
                        return string.upper()

Esto funciona así:

  1. En la top_folder directorio se encuentra la caja de herramientas de sí mismo, tools.tbx y un directorio llamado scripts.
  2. En tools.tbx, todas las herramientas de referencia de sus propios .py archivo en el directorio de scripts (asegúrese de que la ruta de acceso está configurado para familiar en las propiedades de la herramienta), como tool1.py.
  3. Además de la normal import declaraciones al inicio de tool1.py (arcpy, os, etc.) usted puede importar funciones definidas en general.py como así:

from module_name.general import upper_case

  1. Ahora puedes llamar a upper_case() cualquier lugar en tool1.py, y se podría hacer lo mismo en cualquier otra .py archivo en la scripts directorio.

Esto funciona mejor si son capaces de distribuir top_folder como un archivo zip. Porque has conjunto de todas las trayectorias de herramienta para la relación, no importa donde la top_folder se encuentra en su equipo, mientras que los archivos están en orden. Tenga en cuenta que usted necesita el __init__.py archivo (sólo hacer un archivo de texto vacío) para que python reconocerá module_name como algo que puede ser importado.

Usted debe ser capaz de descargar mi propia implementación de este concepto aquí. Al final de la CLI Toolbox/documentation/Using the CLI Toolbox.pdf documento hay una explicación más detallada. Fue mi primer intento de una real implementación de python así que no hay garantías sobre las mejores prácticas, por desgracia.

Espero que ayude!

EDITAR:

Gracias, agradezco el nod.

Nota para cualquier persona interesada en esto: La principal ventaja que fue importante para mí en este esquema es que cualquier emprendedor usuario puede cortar el module_name directorio de aquí su ubicación y péguelo en el site-packages directorio de su local de instalación de Python. Todas las herramientas funcionan como si nada ha cambiado (porque de la forma en que el import declaraciones están construidos), pero ahora usted puede import module_name en las secuencias de comandos que utilizan la misma instalación de Python.

Originalmente tenía la intención de hacer sólo un paquete de python que los usuarios se instala, pero al darse cuenta de que a) las palabras no significan nada para un montón de gente y B) en sistemas de la red de la verdad, no sé donde Python sentaba de todos modos, con este esquema sería el mejor de ambos mundos.

1voto

Farid Cher Puntos 5306

Por @matt wilkie Sugerencias, usted debe utilizar la caja de herramientas de python (.pyt) en lugar de una costumbre (.tbx) caja de herramientas. Sin embargo, con las cajas de herramientas python no tiene modelos. Así que si usted tiene cualquiera de los modelos en la caja de herramientas personalizada, entonces usted tiene dos opciones:

  1. para exportar los modelos a la secuencia de comandos de python herramientas.
  2. para llamar a herramientas en otras cajas de herramientas dentro de la caja de herramientas de Python de código

Aquí está una plantilla de código para la caja de herramientas de python para adaptarse a sus necesidades:

class our_utils: # Or put this class in a seperate file and import it here
    def sharedFunc():
        return

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 = ""

        # List of tool classes associated with this toolbox
        self.tools = [Tool]


class Tool(object):
    def __init__(self):
        """Define the tool (tool name is the name of the class)."""
        self.label = "Tool"
        self.description = ""
        self.canRunInBackground = False

    def execute(self, parameters, messages):
        our_utils.sharedFunc()
        return

    ...

Espero te sirva de ayuda.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X