Überprüfen, ob das Python-Skript in ArcGIS (Arcmap oder auf dem Server) oder einem eigenständigen Python-Skript ausgeführt wird

8

Zu Debugging-Zwecken habe ich eine fest codierte Bedingung erstellt, die überprüft, ob das Skript als eigenständiges oder als ArcGIS-Tool ausgeführt wird. Gibt es überhaupt eine Möglichkeit, dies zur Laufzeit herauszufinden? zB eine Umgebungsvariable, eine globale Variable usw.

z.B

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

Antworten:

19

Überprüfen Sie sys.executable.

Im Python-Fenster:

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

und dann in 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'

Also if os.path.basename(sys.executable).lower() == 'python.exe'sollte es ein Einfacher tun.

Jason Scheirer
quelle
Vielen Dank, aber mein Hauptziel war es, zwischen lokalem Lauf und Serverlauf zu prüfen (dh als Geoverarbeitungsdienst - ich denke, das ist der Name)
Mahdi
Ich glaube, dass sys.executabledies auch als Server-Tool etwas anderes sein wird. Schreiben Sie ein Testskript, das arcpy.AddMessage("Executable: " + sys.executable)zur Bestätigung ausgegeben wird.
Jason Scheirer
1

Wenn ich Ihre Frage richtig verstehe, möchten Sie überprüfen, ob Sie ein Skript als Skript-Tool ausführen oder nicht. Wenn es als Skript-Tool ausgeführt wird, möchten Sie einige Variablen mit GetParameterAsText festlegen. Wenn es als eigenständiges Tool ausgeführt wird, möchten Sie einige fest codierte Variablen verwenden. Ist dies korrekt? In diesem Fall können Sie Folgendes tun:

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'

Indem Sie die Länge von sys.argv überprüfen, bestimmen Sie, wie viele Parameter an das Skript übergeben werden. Es gibt immer mindestens einen Parameter (den Speicherort des Skripts selbst). Wenn also mehr als ein Parameter übergeben wird, können Sie davon ausgehen, dass ArcGIS diese sendet (es sei denn, Sie übergeben Argumente von einem anderen Ort).

Bluefoot
quelle
Nun, das funktioniert jetzt irgendwie. Ich übergebe keine Argumente, aber gibt es einen "eleganteren" Weg?
Mahdi
Wenn Sie mit elegant meinen, kürzer, können Sie es zu einem Einzeiler wie folgt machen:par = arcpy.GetParameterAsText(0) if len(sys.argv) > 1 else 'Hello'
Paul
Mit "elegant" meine ich so etwas wie das Überprüfen einer Umgebungsvariablen usw. Nicht "elegant" im Python-Sinne. Übrigens, während ich diese Struktur selbst oft benutze, setzen wir in dem Fall, den wir diskutieren, höchstwahrscheinlich viele Parameter für das Skript, so dass Short-Ifs nicht wirklich elegant sind.
Mahdi
0

Ein einfacher Weg wäre dies:

import arcpy
par = arcpy.GetParameterAsText(0)
if not par: #If no parameter has been passed, an empty string is returned
  par = 'Hello'
Paul
quelle
Ich habe es vorher noch nicht ausprobiert, aber ich dachte, es würde eine Ausnahme auslösen. Dies ist definitiv interessant. Dennoch kann ich einen Teil der Codelogik, die auf Standalone vs. Tool basiert, nicht neu verkabeln.
Mahdi
Was müssen Sie außer den Parametern noch ändern, wenn das Skript von außerhalb von ArcMap ausgeführt wird?
Paul