Vérification si le script python est exécuté à partir d'ArcGIS (arcmap ou sur serveur) ou d'un script python autonome

8

À des fins de débogage, j'ai créé une conditionnelle codée en dur qui vérifie que le script est exécuté de manière autonome ou en tant qu'outil ArcGIS. Y a-t-il un moyen de le comprendre au moment de l'exécution? par exemple une variable d'environnement, une variable globale, etc.

par exemple

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

Réponses:

19

Vérifiez sys.executable.

Dans la fenêtre Python:

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

puis dans 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'

Donc, un simple if os.path.basename(sys.executable).lower() == 'python.exe'devrait le faire.

Jason Scheirer
la source
Merci, mais mon objectif principal était de vérifier entre l'exécution locale et l'exécution du serveur (c'est-à-dire en tant que service de géotraitement - je pense que c'est le nom)
Mahdi
Je crois que ce sys.executablesera quelque chose de différent lorsqu'il sera également utilisé comme un outil serveur. Écrivez un script de test qui émet arcpy.AddMessage("Executable: " + sys.executable)pour confirmer.
Jason Scheirer
1

Si je comprends bien votre question, vous voulez vérifier si vous exécutez un script comme outil de script ou non. S'il s'exécute en tant qu'outil de script, vous souhaitez définir certaines variables à l'aide de GetParameterAsText, et s'il s'exécute de manière autonome, vous souhaitez utiliser des variables codées en dur, est-ce correct? Si oui, vous pouvez effectuer les opérations suivantes:

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'

En vérifiant la longueur de sys.argv, vous déterminez le nombre de paramètres transmis au script. Il y a toujours au moins un paramètre (l'emplacement du script lui-même), donc s'il y en a plus d'un transmis, vous pouvez supposer qu'ArcGIS les envoie (à moins que vous ne passiez des arguments ailleurs).

bluefoot
la source
bon, ça marche un peu pour le moment b / c je ne passe pas d'arguments mais y a-t-il une manière plus "élégante"?
Mahdi
Si par élégant, vous voulez dire plus court, vous pouvez en faire une doublure comme ça:par = arcpy.GetParameterAsText(0) if len(sys.argv) > 1 else 'Hello'
Paul
par "élégant", je veux dire quelque chose comme vérifier une variable d'environnement, etc. Pas "élégant" au sens python. BTW, bien que j'utilise beaucoup cette structure moi-même, dans le cas dont nous discutons, nous définissons probablement de nombreux paramètres pour le script, de sorte que les raccourcis ne soient pas vraiment élégants.
Mahdi
0

Une façon simple de le faire serait la suivante:

import arcpy
par = arcpy.GetParameterAsText(0)
if not par: #If no parameter has been passed, an empty string is returned
  par = 'Hello'
Paul
la source
Je ne l'ai pas essayé auparavant, mais je pensais que cela soulèverait une exception, c'est certainement intéressant ... pourtant, cela ne me permettra pas de recâbler une partie de la logique du code basée sur l'autonomie par rapport à l'outil.
Mahdi
Que devez-vous changer d'autre que les paramètres si le script est exécuté depuis l'extérieur d'ArcMap?
Paul