Arcpy è in grado di rilevare se è in esecuzione su desktop o server?


9

Sto sviluppando un codice che voglio eseguire sia come servizio Web ArcGIS Server sia come script autonomo. Voglio essere in grado di modificare leggermente l'esecuzione a seconda che sia in esecuzione come un servizio web AGS o come un pitone autonomo / all'interno del desktop.

C'è un modo per rilevarlo?

Ho fatto qualche ricerca ma non ho trovato nulla di molto soddisfacente. Ho visto arcpy.mapping.CreateGISServerConnectionFile, ma questo imposta le connessioni a un server invece di controllare l'ambiente corrente. Ho anche cercato informazioni su come vengono eseguiti i servizi con AGS (ad esempio, questo ), ma non vedo davvero nulla sulla falsariga di un tipo di funzione arcpy.isWebService (). Devo solo controllare l'ambiente (mi piace vedere se è stato impostato "% scratchFolder% o esaminare qualcosa relativo a sys.argv)? Sembra una specie di soluzione instabile.

Risposte:


5

Ho suggerito questo, dopo aver esaminato i risultati di sys.executable, arcpy.GetInstallInfo (), ListInstallations () e ProductInfo (), nessuno dei quali mi ha dato una buona risposta su quale arcpy stavo correndo. @KHibma, qualcosa su cui il team arcpy deve pensare: sarebbe una bella proprietà (arcpy.version - come sys.version).

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

Ho lanciato questo test in funzione. Se hai bisogno di conoscere i bit Python, penso che sia meglio testare sys.version per contenere "32 bit", quindi non l'ho incluso. Scavare la versione di ArcGIS è un po 'più di codice, quindi sono andato avanti e l'ho incluso nella funzione.

# report arcpy platform and version
# author: Curtis Price, cprice@usgs.gov
# 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 

1
Quindi sembra che arcpy .__ file__, arcpy.GetInstallInfo () e arcpy.ProductInfo () forniranno tutti informazioni simili (anche se uno produce "Desktop" mentre l'altro produce "ArcInfo"). Sto pensando che l'opzione arcpy.ProductInfo () sia l'opzione più concisa e leggibile.
Roland

Non l'ho testato ma productinfo potrebbe darti il ​​livello di licenza più alto disponibile se non lo hai importato specificamente con "import arcced", ad esempio). Significa che se hai solo ArcEditor disponibile, è probabilmente quello che ti verrà restituito. Divertente che il server non faccia la stessa cosa, poiché supporta anche più livelli di licenza (base, standard, aziendale)
Curtis Price

Va notato che questo codice Python presuppone che il software sia installato utilizzando le normali convenzioni di denominazione delle cartelle. È abbastanza raro che qualcuno non usi il nome della cartella predefinita "Desktop10.1", anche se può spostare il percorso (ad esempio, installiamo in "C: \ ArcGIS \ Desktop10.1".
Curtis Prezzo

8

@KHibma e altri mi hanno fatto chiedere se potevo ottenere le informazioni usando arcpy per controllare la versione. Ho scavato un po 'alla cieca e penso di avere qualcosa anche se non è quello che mi aspettavo. Non ho ancora controllato in AGS.

Produce un bel 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'}

Quindi posso dire:

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

Grazie per averci dato il calcio!


Ho appena notato che questo torna come "Desktop" in 10.1, quindi meglio localizzare quell'istruzione if per usare d ['ProductName']. Lower ().
Roland

Puoi pubblicare il risultato sul server? Potrebbe essere utile per riferimento futuro.
Petr Krebs,

Decisamente. Scusa per il ritardo. Ho dovuto consultare il mio collega che gestisce l'installazione di AGS. Sotto 10.1, ha ottenuto "Server". Non abbiamo un'istanza di 10.0 AGS, ma eseguire il risultato attraverso una sorta di funzione di capitalizzazione è probabilmente una buona idea.
Roland

Ho dimenticato arcpy.GetInstallInfo (). Sebbene il suo scopo non sia quello di dirti ciò che stai eseguendo (si comporta in modo simile a ListInstallations ... Credo che restituisca solo motore | desktop quando eseguito da 32 e server quando eseguito da Python a 64 bit. Ma se tu ' tornando alle 10.0 come mostrato nel tuo messaggio, dovrai decidere sia il server che il desktop
KHibma

2
@Roland quindi ho provato un altro paio di cose dopo aver parlato con un collega. Non ho 10.0 con DT / AGS sullo stesso machien, quindi non so come andrà, ma prova "arcpy.ProductInfo ()". Ti dice ArcINFO o ArcSERVER ... questo potrebbe effettivamente farlo per te SE stai eseguendo su DT, o lo script come servizio GP in ENTRAMBI 10.0 e 10.1
KHibma,

1
arcpy.ListInstallations()
[u'desktop', u'engine', u'server']

Quindi puoi fare un controllo di ciò che è installato. Questo comunque non ti porterà molto lontano se sia DT che Server sono installati sullo stesso computer. Per quanto riguarda una funzione che ti dice cosa stai eseguendo, no, non esiste.

Pensare ad alta voce: DT è a 32 bit, Server a 64 bit. Potresti fare un sys.path e controllare quale versione di Python è in uso.

o

Se sai che è in esecuzione come servizio GP (non solo usando il pitone del server) rispetto a DT, potresti ispezionare il percorso di arcpy.env.scratchFolder. In un'installazione tipica sarà sempre simile a C: \ arcgisserver \ directories \ arcgisjobs \ [service] _gpserver \ [guid] \ ....


E non dimenticare che ArcGIS Desktop 10.1 ha un'opzione per installare il geoprocessing in background a 64 bit che installa Python a 64 bit.
MLowry,


2
RuntimeManagerè .NET, non un oggetto COM.
Petr Krebs,

C:\Program Files (x86)\Common Files\ArcGIS\bin\ArcGISVersion.dllè una libreria di tipi caricabile che ha molti degli stessi oggetti, che puoi usare dai comtypes.
Jason Scheirer,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.