может arcpy определить, работает ли он на рабочем столе или на сервере?

9

Я разрабатываю код, который хочу запускать как веб-сервис ArcGIS Server, так и как отдельный скрипт. Я хочу иметь возможность немного изменить исполнение в зависимости от того, работает ли он как веб-служба AGS или как автономный python / в Desktop.

Есть ли способ обнаружить это?

Я провел некоторые поиски, но не нашел ничего очень удовлетворительного. Я видел arcpy.mapping.CreateGISServerConnectionFile, но это устанавливает соединения с сервером, а не проверяет текущую среду. Я также искал информацию о том, как службы запускаются в AGS (например, в этом ), но на самом деле я не вижу ничего похожего на функцию типа arcpy.isWebService (). Нужно ли мне просто проверять среду (например, посмотреть, был ли установлен "% scratchFolder%" или исследовать что-то, связанное с sys.argv)? Кажется, это нестабильное решение.

Roland
источник

Ответы:

5

Я предложил это, после просмотра результатов sys.executable, arcpy.GetInstallInfo (), ListInstallations () и ProductInfo (), ни один из которых не дал мне хорошего ответа относительно того, какую Arcpy я запускал. @KHibma, что-то, о чем нужно подумать команде arcpy - это было бы неплохое свойство (arcpy.version - как sys.version).

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

Я бросил этот тест как функцию. Если вам нужно знать биты Python, я думаю, что лучше всего протестировать sys.version на наличие «32 бит», поэтому я не включил это. Раскопки версии ArcGIS - это немного больше кода, поэтому я пошел дальше и включил его в функцию.

# 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
Таким образом, похоже, что arcpy .__ file__, arcpy.GetInstallInfo () и arcpy.ProductInfo () будут давать аналогичную информацию (даже если один создает «Рабочий стол», а другой - «ArcInfo»). Я думаю, что параметр arcpy.ProductInfo () является наиболее кратким и читаемым.
Роланд
Не проверял, но productinfo может дать вам самый высокий доступный уровень лицензии, если вы специально не импортировали его с «import arceditor», например). Это означает, что если у вас есть только ArcEditor, это то, что вы, вероятно, получите обратно. Забавно, что Сервер не делает то же самое, так как он также поддерживает несколько уровней лицензии (базовая, стандартная, корпоративная)
Кертис Прайс
Следует отметить, что этот код Python предполагает, что программное обеспечение установлено с использованием обычных соглашений об именах папок. Кто-то довольно редко не использует имя папки по умолчанию «Desktop10.1», даже если они могут перемещать путь (например, мы устанавливаем в «C: \ ArcGIS \ Desktop10.1».
Curtis Price
8

@KHibma и другие заставили меня задуматься, могу ли я получить информацию, используя arcpy для проверки версии. Я немного слепо покопался и думаю, что у меня что-то есть, даже если это не то, чего я ожидал. Я еще не проверил под AGS.

Это производит хороший диктат:

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

Так что я могу сказать:

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

Спасибо за это!

Roland
источник
Только что заметил, что это возвращается как «Рабочий стол» в 10.1, поэтому лучше найти оператор if для использования d ['ProductName']. Lower ().
Роланд
Можете ли вы опубликовать, что результат на сервере? Может быть полезно для дальнейшего использования.
Петр Кребс
Определенно. Извините за задержку. Пришлось пройти через моего коллегу, который управляет установкой AGS. Под 10.1 он получил "Сервер". У нас нет экземпляра 10.0 AGS, но, вероятно, хорошая идея - выполнить результат через какую-то функцию капитализации.
Роланд
Я забыл про arcpy.GetInstallInfo (). Хотя его цель - не рассказать вам, под чем вы работаете (он действует почти так же, как ListInstallations ... Я полагаю, что он возвращает только engine | desktop при запуске из 32 и server при запуске из 64-битного Python. Но если вы ' вернитесь к 10.0, как это показано в вашем сообщении, у вас будет выбор сервера и рабочего стола
KHibma
2
@Roland, поэтому я проверил еще пару вещей после разговора с коллегой. У меня нет 10.0 с DT / AGS на той же машине, поэтому я не знаю, как это будет происходить, но попробуйте "arcpy.ProductInfo ()". Он говорит вам ArcINFO или ArcSERVER ... это на самом деле может сделать это для вас, если вы либо работаете на DT, либо сценарием в качестве службы GP в ОБА 10.0 и 10.1
KHibma
1
arcpy.ListInstallations()
[u'desktop', u'engine', u'server']

Таким образом, вы можете проверить, что установлено. Это, однако, не поможет вам, если DT и Server установлены на одной машине. Что касается функции, которая говорит вам, что вы работаете, нет, не существует.

Размышление вслух: DT 32-битный, сервер 64-битный. Вы можете сделать sys.path и проверить, какая версия Python используется.

или

Если вы знаете, что он работает как служба GP (а не только с использованием python-сервера) по сравнению с DT, вы можете проверить путь к arcpy.env.scratchFolder. При обычной установке он всегда будет выглядеть примерно так: C: \ arcgisserver \ directoryies \ arcgisjobs \ [service] _gpserver \ [guid] \ ....

KHibma
источник
И не забывайте, что ArcGIS Desktop 10.1 имеет возможность установить 64-битную фоновую геообработку, которая устанавливает Python 64-битную.
MLowry
Разве этот метод для вызова ArcObjects из python не позволит вам вызвать RuntimeManager.ActiveRuntime ?
Кирк Куйкендалл
2
RuntimeManagerэто .NET, а не COM-объект.
Петр Кребс
C:\Program Files (x86)\Common Files\ArcGIS\bin\ArcGISVersion.dllявляется загружаемой библиотекой типов, которая имеет много одинаковых объектов, вы можете использовать это из комтипов.
Джейсон Шайрер