¿Arcpy puede detectar si se está ejecutando en Desktop o Server?

9

Estoy desarrollando un código que quiero ejecutar tanto como un servicio web de ArcGIS Server como un script independiente. Quiero poder modificar ligeramente la ejecución dependiendo de si se está ejecutando como un servicio web AGS o como un python / dentro de Desktop.

¿Hay alguna forma de detectar esto?

He hecho algunas búsquedas pero no he encontrado nada muy satisfactorio. He visto arcpy.mapping.CreateGISServerConnectionFile, pero esto establece conexiones a un servidor en lugar de verificar el entorno actual. También busqué información sobre cómo se ejecutan los servicios con AGS (por ejemplo, esto ), pero realmente no veo nada similar a un tipo de función arcpy.isWebService (). ¿Solo necesito verificar el entorno (para ver si se ha configurado "% scratchFolder% o examinar algo relacionado con sys.argv)? Parece una solución inestable.

Roland
fuente

Respuestas:

5

Sugerí esto, después de revisar los resultados de sys.executable, arcpy.GetInstallInfo (), ListInstallations () y ProductInfo (), ninguno de los cuales me dio una buena respuesta sobre qué arcpy estaba ejecutando. @KHibma, algo en lo que el equipo de arcpy debe pensar: sería una buena propiedad (arcpy.version, como sys.version).

>>> import arcpy
>>> arcpy.__file__
'C:\\ArcGIS\\Desktop10.1\\arcpy\\arcpy\\__init__.py'

Lanzo esta prueba como una función. Si necesita conocer los bits de Python, creo que es mejor probar sys.version para contener "32 bits", así que no incluí eso. Desenterrar la versión de ArcGIS es un poco más de código, así que seguí adelante e incluí eso en la función.

# report arcpy platform and version
# author: Curtis Price, [email protected]
# date: 2014/08/09 (update to support ArcGIS Pro)

def ArcPyVersion():
    """Report ArcPy version

    example

    >>> ArcPyVersion()
    'Desktop 10.1.3143'
    """
    import arcpy
    f = arcpy.__file__
    if f.find("Desktop") > 0:
      v = "Desktop" 
    elif f.lower().find("arcgis pro") > 0:
      v = "ArcGISPro"
    else:
      v = "Server"
    i = arcpy.GetInstallInfo()
    v = "{0} {1}.{2}".format(
            v, i["Version"], i["BuildNumber"])
    return v 
Precio Curtis
fuente
1
Por lo tanto, parece que arcpy .__ file__, arcpy.GetInstallInfo () y arcpy.ProductInfo () generarán información similar (incluso si uno produce "Desktop" mientras que el otro produce "ArcInfo"). Estoy pensando que la opción arcpy.ProductInfo () es la opción más concisa y legible.
Roland
No lo he probado, pero la información del producto puede darle el nivel de licencia más alto disponible si no lo ha importado específicamente con "import arceditor", por ejemplo). Es decir, si solo tiene ArcEditor disponible, eso es lo que probablemente obtendrá. Es curioso que el servidor no haga lo mismo, ya que también admite múltiples niveles de licencia (básico, estándar, empresarial)
Curtis Price
Debe tenerse en cuenta que este código de Python supone que el software se instala utilizando las convenciones de nomenclatura de carpetas normales. Es bastante raro que alguien no use el nombre de carpeta predeterminado "Desktop10.1" evn si puede mover la ruta (por ejemplo, instalamos en "C: \ ArcGIS \ Desktop10.1".
Curtis Price
8

@KHibma y otros me hicieron preguntarme si podría obtener la información usando arcpy para verificar la versión. Cavé un poco a ciegas y creo que tengo algo, incluso si no es lo que esperaba. No he comprobado bajo AGS todavía.

Produce un buen dict:

>>> d=arcpy.GetInstallInfo()
>>> d

{'BuildNumber': u'2414',
 'InstallDate': u'5/16/2012',
 'InstallDir': u'C:\\ArcGIS\\Desktop10.0\\',
 'InstallTime': u'16:32:14',
 'InstallType': u'N/A',
 'Installer': u'abock',
 'ProductName': u'desktop',
 'SPBuild': u'10.0.4.4000',
 'SPNumber': u'4',
 'SourceDir': u'\\\\igskahhwvsawesm\\arcgis_10\\Desktop\\Desktop\\',
 'Version': u'10.0'}

Entonces puedo decir:

if d['ProductName'] == u'desktop':
    ...
else:
    ....

¡Gracias por patear eso!

Roland
fuente
Acabo de darme cuenta de que esto regresa como "Escritorio" en 10.1, por lo que es mejor ubicar esa instrucción if para usar d ['ProductName']. Lower ().
Roland
¿Puedes publicar cuál es el resultado en el servidor? Podría ser útil para futuras referencias.
Petr Krebs
Seguro. Perdón por el retraso. Tuve que pasar por mi colega que ejecuta la instalación de AGS. Bajo 10.1, obtuvo "Servidor". No tenemos una instancia de 10.0 AGS, pero ejecutar el resultado a través de algún tipo de función de capitalización es probablemente una buena idea.
Roland
Me olvidé de arcpy.GetInstallInfo (). Si bien su propósito no es decir con qué se está ejecutando (actúa de manera muy similar a ListInstallations ... Creo que solo devuelve el motor | escritorio cuando se ejecuta desde 32 y el servidor cuando se ejecuta desde Python de 64 bits. Pero si usted ' de vuelta a las 10.0 como se muestra en su mensaje, tendrá que decidir tanto el servidor como el escritorio
KHibma
2
@Roland, así que probé un par de cosas más después de hablar con un colega. No tengo 10.0 con DT / AGS en la misma máquina, así que no sé cómo funcionará, pero intente "arcpy.ProductInfo ()". Te dice ArcINFO o ArcSERVER ... esto en realidad podría hacerlo por ti SI estás ejecutando en DT, o el script como GP Service en AMBOS 10.0 y 10.1
KHibma
1
arcpy.ListInstallations()
[u'desktop', u'engine', u'server']

Para que pueda verificar qué está instalado. Sin embargo, esto no lo llevará muy lejos si DT y Server están instalados en la misma máquina. En cuanto a una función que te dice en qué te estás ejecutando, no, no existe.

Pensando en voz alta: DT es de 32 bits, el servidor es de 64 bits. Puede hacer un sys.path e inspeccionar qué versión de Python se está utilizando.

o

Si sabe que se está ejecutando como un servicio GP (no solo usando el python del servidor) frente a DT, puede inspeccionar la ruta de arcpy.env.scratchFolder. En una instalación típica, siempre se verá como C: \ arcgisserver \ directorios \ arcgisjobs \ [service] _gpserver \ [guid] \ ....

KHibma
fuente
Y no olvide que ArcGIS Desktop 10.1 tiene una opción para instalar geoprocesamiento en segundo plano de 64 bits que instala Python de 64 bits.
MLowry
2
RuntimeManageres .NET, no un objeto COM.
Petr Krebs
C:\Program Files (x86)\Common Files\ArcGIS\bin\ArcGISVersion.dlles una biblioteca de tipo cargable que tiene muchos de los mismos objetos, podría usarla desde los tipos.
Jason Scheirer