Kann arcpy erkennen, ob es auf dem Desktop oder auf dem Server ausgeführt wird?

9

Ich entwickle Code, den ich sowohl als ArcGIS Server-Webdienst als auch als eigenständiges Skript ausführen möchte. Ich möchte in der Lage sein, die Ausführung geringfügig zu ändern, je nachdem, ob sie als AGS-Webdienst oder als eigenständige Python / innerhalb von Desktop ausgeführt wird.

Gibt es eine Möglichkeit, dies zu erkennen?

Ich habe etwas gesucht, aber nichts sehr zufriedenstellendes gefunden. Ich habe arcpy.mapping.CreateGISServerConnectionFile gesehen , aber dadurch werden Verbindungen zu einem Server hergestellt, anstatt die aktuelle Umgebung zu überprüfen. Ich habe auch nach Informationen darüber gesucht, wie Dienste mit AGS ausgeführt werden (z. B. dies ), aber ich sehe nicht wirklich etwas in der Art einer Funktion vom Typ arcpy.isWebService (). Muss ich nur die Umgebung überprüfen (um festzustellen, ob "% ScratchFolder% festgelegt wurde oder etwas im Zusammenhang mit sys.argv untersucht wurde)? Scheint eine instabile Lösung zu sein.

Roland
quelle

Antworten:

5

Ich schlug dies vor, nachdem ich mir die Ergebnisse von sys.executable, arcpy.GetInstallInfo (), ListInstallations () und ProductInfo () angesehen hatte. Keines davon gab mir eine gute Antwort darauf, welches arcpy ich ausführte. @KHibma, etwas, über das das arcpy-Team nachdenken sollte - es wäre eine nette Eigenschaft (arcpy.version - wie sys.version).

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

Ich habe diesen Test als Funktion durchgeführt. Wenn Sie die Python-Bits kennen müssen, ist es meiner Meinung nach am besten, nur sys.version auf "32-Bit" zu testen, damit ich das nicht einbeziehe. Das Ausgraben der ArcGIS-Version ist etwas mehr Code, daher habe ich diesen in die Funktion aufgenommen.

# 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 
Curtis Price
quelle
1
Es scheint also, als würden arcpy .__ file__, arcpy.GetInstallInfo () und arcpy.ProductInfo () ähnliche Informationen liefern (selbst wenn einer "Desktop" erzeugt, während der andere "ArcInfo" erzeugt). Ich denke, die Option arcpy.ProductInfo () ist die präziseste und lesbarste Option.
Roland
Ich habe es noch nicht getestet, aber productinfo bietet Ihnen möglicherweise die höchste verfügbare Lizenzstufe, wenn Sie es nicht speziell mit "import arceditor" importiert haben. Das heißt, wenn Sie nur ArcEditor zur Verfügung haben, erhalten Sie diese wahrscheinlich zurück. Komisch, dass Server nicht dasselbe tut, da er auch mehrere Lizenzstufen (Basic, Standard, Enterprise) unterstützt
Curtis Price
Es ist zu beachten, dass dieser Python-Code davon ausgeht, dass die Software unter Verwendung der normalen Ordnernamenkonventionen installiert ist. Es ist ziemlich selten, dass jemand den Standardordnernamen "Desktop10.1" nicht verwendet, wenn er den Pfad verschieben darf (z. B. installieren wir ihn unter "C: \ ArcGIS \ Desktop10.1".
Curtis Price
8

@KHibma und andere haben mich gefragt, ob ich die Informationen erhalten könnte, indem ich arcpy verwende, um die Version zu überprüfen. Ich habe mich etwas blind herumgetrieben und ich glaube, ich habe etwas, auch wenn es nicht das ist, was ich erwartet hatte. Ich habe noch nicht unter AGS nachgesehen.

Es ergibt sich ein schönes Diktat:

>>> 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'}

Also kann ich sagen:

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

Danke, dass du das herumgetreten hast!

Roland
quelle
Ich habe gerade bemerkt, dass dies in 10.1 als "Desktop" zurückkommt. Suchen Sie also besser nach der if-Anweisung, um d ['ProductName']. Lower () zu verwenden.
Roland
Können Sie das Ergebnis auf dem Server veröffentlichen? Könnte für zukünftige Referenz nützlich sein.
Petr Krebs
Bestimmt. Entschuldigung für die Verspätung. Musste meinen Kollegen durchgehen, der die AGS-Installation ausführt. Unter 10.1 bekam er "Server". Wir haben keine 10.0 AGS-Instanz, aber es ist wahrscheinlich eine gute Idee, das Ergebnis durch eine Kapitalisierungsfunktion zu führen.
Roland
Ich habe arcpy.GetInstallInfo () vergessen. Es soll zwar nicht sagen, unter was Sie ausgeführt werden (es verhält sich ähnlich wie ListInstallations ... Ich glaube, es gibt nur engine | desktop zurück, wenn es von 32 ausgeführt wird, und server, wenn es von 64-Bit-Python ausgeführt wird.
Wenn
2
@ Roland also habe ich noch ein paar Dinge getestet, nachdem ich mit einem Kollegen gesprochen habe. Ich habe nicht 10.0 mit DT / AGS auf dem gleichen Machien, also weiß ich nicht, wie das gehen wird, aber versuche "arcpy.ProductInfo ()". Es sagt Ihnen ArcINFO oder ArcSERVER ... dies könnte es tatsächlich für Sie tun, WENN Sie entweder auf DT oder dem Skript als GP-Dienst in BEIDEN 10.0 und 10.1
KHibma
1
arcpy.ListInstallations()
[u'desktop', u'engine', u'server']

So können Sie überprüfen, was installiert ist. Dies bringt Sie jedoch nicht sehr weit, wenn sowohl DT als auch Server auf demselben Computer installiert sind. Eine Funktion, die Ihnen sagt, unter was Sie ausgeführt werden, ist nicht vorhanden.

Laut denken: DT ist 32bit, Server ist 64bit. Sie können einen sys.path erstellen und überprüfen, welche Version von Python verwendet wird.

oder

Wenn Sie wissen, dass es entweder als GP-Dienst (nicht nur mit Python des Servers) oder als DT ausgeführt wird, können Sie den Pfad von arcpy.env.scratchFolder überprüfen. Bei einer typischen Installation sieht es immer so aus wie C: \ arcgisserver \ directory \ arcgisjobs \ [service] _gpserver \ [guid] \ ....

KHibma
quelle
Vergessen Sie nicht, dass ArcGIS Desktop 10.1 eine Option zum Installieren der 64-Bit-Hintergrund-Geoverarbeitung bietet, mit der Python 64-Bit installiert wird.
MLowry
Würden Sie mit dieser Methode zum Aufrufen von ArcObjects aus Python nicht RuntimeManager.ActiveRuntime aufrufen können ?
Kirk Kuykendall
2
RuntimeManagerist .NET, kein COM-Objekt.
Petr Krebs
C:\Program Files (x86)\Common Files\ArcGIS\bin\ArcGISVersion.dllist eine ladbare Typbibliothek, die viele der gleichen Objekte enthält. Sie können diese von comtypes verwenden.
Jason Scheirer