Comprobando si el script de Python se ejecuta desde ArcGIS (arcmap o en el servidor) o un script de Python independiente

8

Para fines de depuración, he creado un condicional codificado que verifica que el script se ejecute de forma independiente o como una herramienta ArcGIS. ¿Hay alguna forma de descubrir esto en tiempo de ejecución? Por ejemplo, alguna variable de entorno, variable global, etc.

p.ej

dryRun= 1
if dryRun:
    par= 'Hello'
else:
    par= arcpy.GetParameterAsText(0)
# Do something
Mahdi
fuente

Respuestas:

19

Compruebe sys.executable.

En la ventana de Python:

>>> import sys
>>> sys.executable
'C:\\Program Files (x86)\\ArcGIS\\Desktop10.2\\bin\\ArcMap.exe'

y luego en Python.exe:

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.executable
'C:\\Python27\\ArcGIS10.2\\python.exe'

Entonces un simple if os.path.basename(sys.executable).lower() == 'python.exe'debería hacerlo.

Jason Scheirer
fuente
Gracias, pero mi objetivo principal era verificar entre la ejecución local y la ejecución del servidor (es decir, como un servicio de geoprocesamiento, creo que ese es el nombre)
Mahdi
Creo que sys.executabletambién será algo diferente cuando se ejecute como una herramienta de servidor. Escriba un script de prueba que emita arcpy.AddMessage("Executable: " + sys.executable)para confirmar.
Jason Scheirer
1

Si entiendo su pregunta correctamente, desea verificar si está ejecutando un script como herramienta de script o no. Si se ejecuta como una herramienta de secuencia de comandos, desea establecer algunas variables usando GetParameterAsText, y si se ejecuta de forma independiente, desea utilizar algunas variables codificadas, ¿es esto correcto? Si es así, puede hacer lo siguiente:

if len(sys.argv) > 1:
    #Assign input and output parameters for script tool
    par = arcpy.GetParameterAsText(0)
else:
    # Hard coded parameters for testing
    par = 'Hello'

Al verificar la longitud de sys.argv, está determinando cuántos parámetros se pasan al script. Siempre hay al menos un parámetro (la ubicación del script en sí), por lo que si se pasa más de uno, puede suponer que ArcGIS los está enviando (a menos que esté pasando argumentos desde otro lugar).

pie azul
fuente
bueno, esto funciona por ahora b / c No paso argumentos pero ¿hay alguna forma más "elegante"?
Mahdi
Si por elegante, te refieres a más corto, puedes hacerlo de una sola línea así:par = arcpy.GetParameterAsText(0) if len(sys.argv) > 1 else 'Hello'
Paul
por "elegante" me refiero a algo como verificar una variable de entorno, etc. No es "elegante" en el sentido de Python. Por cierto, aunque utilizo mucho esta estructura, en el caso que estamos discutiendo, lo más probable es que establezcamos muchos parámetros para el guión, de modo que las abreviaturas no sean realmente elegantes.
Mahdi
0

Una forma simple de hacerlo sería así:

import arcpy
par = arcpy.GetParameterAsText(0)
if not par: #If no parameter has been passed, an empty string is returned
  par = 'Hello'
Pablo
fuente
No lo intenté antes, pero pensé que generaría una excepción, esto es definitivamente interesante ... sin embargo, no me permitirá volver a cablear parte de la lógica del código basada en una herramienta independiente vs.
Mahdi
¿Qué más necesita cambiar además de los parámetros si el script se ejecuta desde fuera de ArcMap?
Paul