arcpy peut-il détecter s'il fonctionne sur le bureau ou sur le serveur?

9

Je développe du code que je souhaite exécuter à la fois en tant que service Web ArcGIS Server et en tant que script autonome. Je veux pouvoir modifier légèrement l'exécution selon qu'elle s'exécute en tant que service Web AGS ou en tant que python autonome / dans Desktop.

Existe-t-il un moyen de détecter cela?

J'ai fait quelques recherches mais je n'ai rien trouvé de très satisfaisant. J'ai vu arcpy.mapping.CreateGISServerConnectionFile, mais cela définit les connexions à un serveur au lieu de vérifier l'environnement actuel. J'ai également cherché des informations sur la façon dont les services sont exécutés avec AGS (par exemple, ceci ), mais je ne vois vraiment rien dans le sens d'une fonction de type arcpy.isWebService (). Ai-je juste besoin de vérifier l'environnement (comme pour voir si "% scratchFolder% a été défini ou examiner quelque chose lié à sys.argv)? Semble une sorte de solution instable.

Roland
la source

Réponses:

5

Je l'ai suggéré, après avoir examiné les résultats de sys.executable, arcpy.GetInstallInfo (), ListInstallations () et ProductInfo (), dont aucun ne m'a donné une bonne réponse quant à l'arcpy que j'exécutais. @KHibma, quelque chose pour l'équipe arcpy à penser - ce serait une belle propriété (arcpy.version - comme sys.version).

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

J'ai jeté ce test en fonction. Si vous avez besoin de connaître les bits Python, je pense qu'il est préférable de simplement tester sys.version pour contenir "32 bits", donc je ne l'ai pas inclus. Déterrer la version d'ArcGIS est un peu plus de code, j'ai donc continué et inclus cela dans la fonction.

# 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 
Prix ​​Curtis
la source
1
Il semble donc que arcpy .__ file__, arcpy.GetInstallInfo () et arcpy.ProductInfo () produiront tous des informations similaires (même si l'un produit "Desktop" tandis que l'autre produit "ArcInfo"). Je pense que l'option arcpy.ProductInfo () est l'option la plus concise et la plus lisible.
Roland
Je ne l'ai pas testé mais productinfo peut vous donner le plus haut niveau de licence disponible si vous ne l'avez pas spécifiquement importé avec "import arceditor" par exemple). Ce qui signifie que si vous ne disposez que d'ArcEditor, c'est ce que vous obtiendrez probablement. C'est drôle que le serveur ne fasse pas la même chose, car il prend également en charge plusieurs niveaux de licence (de base, standard, entreprise)
Curtis Price
Il convient de noter que ce code Python suppose que le logiciel est installé à l'aide des conventions de dénomination de dossier normales. Il est assez rare que quelqu'un n'utilise pas le nom de dossier par défaut "Desktop10.1" evn s'il peut déplacer le chemin (par exemple, nous installons dans "C: \ ArcGIS \ Desktop10.1".
Curtis Price
8

@KHibma et d'autres m'ont fait me demander si je pourrais obtenir les informations en utilisant arcpy pour vérifier la version. J'ai creusé un peu aveuglément et je pense que j'ai quelque chose même si ce n'est pas ce que j'attendais. Je n'ai pas encore vérifié sous AGS.

Il produit un joli 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'}

Je peux donc dire:

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

Merci d'avoir lancé ça!

Roland
la source
Je viens de remarquer que cela revient en tant que "Bureau" dans 10.1, donc mieux localiser cette instruction if pour utiliser d ['ProductName']. Lower ().
Roland
Pouvez-vous publier le résultat sur le serveur? Pourrait être utile pour référence future.
Petr Krebs
Absolument. Désolé pour le retard. J'ai dû passer par mon collègue qui gère l'installation AGS. Sous 10.1, il a obtenu "Server". Nous n'avons pas d'instance AGS 10.0, mais l'exécution du résultat via une sorte de fonction de capitalisation est probablement une bonne idée.
Roland
J'ai oublié arcpy.GetInstallInfo (). Bien que son but ne soit pas de vous dire sous quoi vous exécutez (il agit de la même manière que ListInstallations ... Je pense qu'il ne renvoie le moteur | bureau que lorsqu'il est exécuté à partir de 32 et le serveur lorsqu'il est exécuté à partir de Python 64 bits. Mais si vous '' de retour à 10.0 comme cela apparaît dans votre message, vous aurez à la fois le serveur et le bureau pour décider
KHibma
2
@Roland, j'ai donc testé quelques autres choses après avoir parlé à un collègue. Je n'ai pas 10.0 avec DT / AGS sur le même machien, donc je ne sais pas comment cela se passera, mais essayez "arcpy.ProductInfo ()". Il vous indique ArcINFO ou ArcSERVER ... cela pourrait en fait le faire pour vous SI vous exécutez sur DT, ou le script en tant que service GP dans les DEUX 10.0 et 10.1
KHibma
1
arcpy.ListInstallations()
[u'desktop', u'engine', u'server']

Vous pouvez donc vérifier ce qui est installé. Cela ne vous mènera cependant pas très loin si DT et le serveur sont installés sur la même machine. Quant à une fonction qui vous indique sous quoi vous exécutez, non, n'existe pas.

Penser à haute voix: DT est 32 bits, le serveur est 64 bits. Vous pouvez faire un sys.path et inspecter la version de Python utilisée.

ou

Si vous savez qu'il fonctionne en tant que service GP (et pas seulement en utilisant le python du serveur) vs DT, vous pouvez inspecter le chemin de arcpy.env.scratchFolder. Sur une installation typique, il ressemblera toujours à quelque chose comme C: \ arcgisserver \ répertoires \ arcgisjobs \ [service] _gpserver \ [guid] \ ....

KHibma
la source
Et n'oubliez pas qu'ArcGIS Desktop 10.1 a une option pour installer un géotraitement en arrière-plan 64 bits qui installe Python 64 bits.
MLowry
Cette méthode pour appeler ArcObjects à partir de python ne vous permettrait-elle pas d'appeler RuntimeManager.ActiveRuntime ?
Kirk Kuykendall
2
RuntimeManagerest .NET, pas un objet COM.
Petr Krebs
C:\Program Files (x86)\Common Files\ArcGIS\bin\ArcGISVersion.dllest une bibliothèque de types chargeable qui a plusieurs des mêmes objets, vous pouvez l'utiliser à partir de types de com.
Jason Scheirer