може arcpy виявити, працює він на робочому столі чи сервері?


9

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

Чи є спосіб виявити це?

Я кілька пошукав, але не знайшов нічого задовільного. Я бачив arcpy.mapping.CreateGISServerConnectionFile, але це встановлює з'єднання з сервером на відміну від перевірки поточного середовища. Я також шукав інформацію про те, як запускаються сервіси без AGS (наприклад, це ), але я насправді нічого не бачу відповідно до типу функції arcpy.isWebService (). Мені просто потрібно перевірити середовище (наприклад, щоб перевірити, чи встановлено "% scratchFolder% або вивчає щось, що стосується sys.argv)? Здається, це нестабільне рішення.

Відповіді:


5

Я запропонував це, ознайомившись з результатами sys.executable, arcpy.GetInstallInfo (), ListInstallations () та ProductInfo (), жоден з яких не дав мені гарної відповіді щодо того, якою аркпією я працював. @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 () отримають подібну інформацію (навіть якщо один виробляє "Desktop", а інший виробляє "ArcInfo"). Я думаю, що параметр arcpy.ProductInfo () - це найбільш стислий і читабельний варіант.
Роланд

Не перевірений, але інформація про продукт може дати вам найвищий доступний рівень ліцензії, якщо ви спеціально не імпортували його, наприклад, з "імпортом арседитора". Це означає, що якщо у вас є тільки ArcEditor, це, ймовірно, ви отримаєте назад. Смішно, що сервер не робить те саме, оскільки він також підтримує кілька рівнів ліцензій (базовий, стандартний, корпоративний)
Кертіс Ціна

Слід зазначити, що цей код Python передбачає, що програмне забезпечення встановлено за допомогою звичайних умов іменування папок. Досить рідко хтось не використовує назву папки за замовчуванням "Desktop10.1" evn, якщо вони можуть переміщати шлях (наприклад, ми встановлюємо на "C: \ ArcGIS \ Desktop10.1".
Кертіс Ціна

8

@KHibma та інші змусили мене замислитися, чи можу я отримати інформацію, використовуючи arcpy для перевірки версії. Я копався дещо наосліп, і я думаю, що я щось отримав, навіть якщо це не те, чого я очікував. Я ще не перевірився на АГС.

Це дає хороший знімок:

>>> 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:
    ....

Дякую за те, що б'ють по ній!


Щойно помітив, це повертається як "Desktop" в 10.1, тому краще знайдіть, що якщо у заяві використовувати d ['ProductName']. Нижче ().
Роланд

Чи можете ви опублікувати, який результат є на сервері? Може бути корисним для подальшого використання.
Петро Кребс

Безумовно. Вибачте за затримку. Довелося пройти моєму колезі, який керує установкою AGS. До 10.1 він отримав "Сервер". У нас немає екземпляра 10.0 AGS, але запуск результату через якусь функцію капіталізації, ймовірно, є хорошою ідеєю.
Роланд

Я забув про arcpy.GetInstallInfo (). Хоча це не полягає в тому, щоб розповісти, під чим ти працюєш (він працює так само, як ListInstallations ... Я вважаю, що він повертає двигун | робочий стіл лише при запуску з 32 та сервері при запуску з 64-бітного Python. Але якщо ти знову в 10.0, як це відображається у вашому повідомленні, вам доведеться вирішувати як сервер, так і робочий стіл
KHibma

2
@Roland, тому я перевірив ще пару речей після розмови з колегою. У мене немає 10.0 з DT / AGS на тій же машині, тому я не знаю, як це піде, але спробуйте "arcpy.ProductInfo ()". Це говорить вам про ArcINFO або ArcSERVER ... це насправді може зробити це для вас, якщо ви або працюєте на DT, або сценарій як GP-служба в BOTH 10.0 і 10.1
KHibma

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

Таким чином, ви можете перевірити, що встановлено. Однак це не дасть вам дуже далеко, якщо і DT, і сервер встановлені на одній машині. Щодо функції, яка говорить вам, під чим ви працюєте, ні, не існує.

Думаючи вголос: DT - 32 біт, сервер - 64 біт. Ви можете зробити sys.path і перевірити, яка версія Python використовується.

або

Якщо ви знаєте, що вона працює як GP-сервіс (а не тільки з використанням python сервера) проти DT, ви можете перевірити шлях arcpy.env.scratchFolder. У типовій установці вона завжди буде виглядати приблизно як C: \ arcgisserver \ directories \ arcgisjobs \ [service] _gpserver \ [guide] \ ....


І не забувайте, що в ArcGIS Desktop 10.1 є можливість встановити 64-бітну географічну обробку, яка встановлює 64-бітну Python.
MLowry

Хіба цей метод виклику ArcObjects з python не дозволить вам зателефонувати RuntimeManager.ActiveRuntime ?
Кірк Куйкендалл

2
RuntimeManagerє .NET, не є об'єктом COM.
Петро Кребс

C:\Program Files (x86)\Common Files\ArcGIS\bin\ArcGISVersion.dllце бібліотека типів, що завантажуються, яка містить багато однакових об'єктів, ви можете використовувати її з комтитів.
Jason Scheirer
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.