czy Arcpy może wykryć, czy działa na komputerze, czy na serwerze?

9

Tworzę kod, który chcę uruchomić zarówno jako usługę internetową ArcGIS Server, jak i jako samodzielny skrypt. Chcę móc nieco zmodyfikować wykonanie w zależności od tego, czy działa jako usługa sieciowa AGS, czy jako samodzielny python / na pulpicie.

Czy istnieje sposób na wykrycie tego?

Przeszukałem trochę, ale nie znalazłem nic zadowalającego. Widziałem arcpy.mapping.CreateGISServerConnectionFile, ale ustawia to połączenia z serwerem w przeciwieństwie do sprawdzania bieżącego środowiska. Szukałem również informacji o tym, jak usługi są uruchamiane z AGS (np. To ), ale tak naprawdę nie widzę nic podobnego do funkcji typu arcpy.isWebService (). Czy muszę tylko sprawdzać środowisko (na przykład sprawdzić, czy ustawiono „% scratchFolder% lub badać coś związanego z sys.argv)? Wydaje się to niestabilnym rozwiązaniem.

Roland
źródło

Odpowiedzi:

5

Zasugerowałem to, po zapoznaniu się z wynikami sys.executable, arcpy.GetInstallInfo (), ListInstallations () i ProductInfo (), z których żadne nie dało mi dobrej odpowiedzi na pytanie, która arkada byłam uruchomiona. @KHibma, coś, o czym powinien pomyśleć zespół arcpy - byłaby to dobra właściwość (arcpy.version - jak sys.version).

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

Rzuciłem ten test jako funkcję. Jeśli chcesz znać bity Pythona, myślę, że najlepiej jest po prostu przetestować sys.version pod kątem zawartości „32 bitów”, więc nie uwzględniłem tego. Wykopanie wersji ArcGIS to trochę więcej kodu, więc poszedłem dalej i umieściłem to w funkcji.

# 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 
Cena Curtis
źródło
1
Wygląda więc na to, że arcpy .__ file__, arcpy.GetInstallInfo () i arcpy.ProductInfo () dostarczą podobnych informacji (nawet jeśli jeden produkuje „Desktop”, a drugi „ArcInfo”). Myślę, że opcja arcpy.ProductInfo () jest najbardziej zwięzłą i czytelną opcją.
Roland
Nie przetestowałem tego, ale informacja o produkcie może dać ci najwyższy dostępny poziom licencji, jeśli nie zaimportowałeś go specjalnie na przykład za pomocą „importu arceditor”). Oznacza to, że jeśli masz tylko ArcEditor, prawdopodobnie to otrzymasz. Zabawne, że serwer nie robi tego samego, ponieważ obsługuje także wiele poziomów licencji (podstawowe, standardowe, korporacyjne)
Curtis Price
Należy zauważyć, że ten kod Python zakłada, że ​​oprogramowanie jest instalowane przy użyciu normalnych konwencji nazewnictwa folderów. Rzadko zdarza się, aby ktoś nie używał domyślnej nazwy folderu „Desktop10.1” evn, jeśli może przenieść ścieżkę (na przykład instalujemy do „C: \ ArcGIS \ Desktop10.1”.
Curtis Price
8

@KHibma i inni sprawili, że zastanawiałem się, czy mogę uzyskać informacje, używając arcpy do sprawdzenia wersji. Kopałem trochę na ślepo i myślę, że coś mam, nawet jeśli nie tego się spodziewałem. Nie sprawdziłem jeszcze w AGS.

Daje ładny dykt:

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

Mogę więc powiedzieć:

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

Dzięki, że to skopałeś!

Roland
źródło
Właśnie zauważyłem, że w wersji 10.1 jest to „Desktop”, więc lepiej zlokalizuj instrukcję if, aby użyć d ['ProductName']. Lower ().
Roland
Czy możesz opublikować wynik na serwerze? Może być przydatny w przyszłości.
Petr Krebs
Zdecydowanie. Przepraszam za opóźnienie. Musiałem przejść przez mojego kolegę, który prowadzi instalację AGS. Poniżej 10.1 dostał „Serwer”. Nie mamy instancji 10.0 AGS, ale uruchomienie wyniku za pomocą funkcji wielkich liter jest prawdopodobnie dobrym pomysłem.
Roland
Zapomniałem o arcpy.GetInstallInfo (). Chociaż nie ma na celu informowania Cię o tym, na czym działasz (działa tak samo jak ListInstallations ... Wierzę, że zwraca silnik | desktop po uruchomieniu z 32 i serwera po uruchomieniu z 64-bitowego Pythona. Ale jeśli ' ponownie o 10.0, tak jak to pokazano w wiadomości, będziesz musiał wybrać serwer i komputer stacjonarny
KHibma
2
@Roland, więc po rozmowie z kolegą przetestowałem jeszcze kilka rzeczy. Nie mam 10.0 z DT / AGS na tym samym komputerze, więc nie wiem jak to pójdzie, ale spróbuj "arcpy.ProductInfo ()". Mówi ci ArcINFO lub ArcSERVER ... to może zrobić to dla ciebie, JEŚLI korzystasz z DT lub skryptu jako usługi GP ZARÓWNO 10.0 i 10.1
KHibma
1
arcpy.ListInstallations()
[u'desktop', u'engine', u'server']

Możesz więc sprawdzić, co jest zainstalowane. To jednak nie zajdzie daleko, jeśli zarówno DT, jak i Serwer są zainstalowane na tym samym komputerze. Jeśli chodzi o funkcję, która mówi ci, pod czym pracujesz, nie, nie istnieje.

Myślenie na głos: DT to 32 bity, serwer to 64 bity. Możesz zrobić sys.path i sprawdzić, która wersja Pythona jest używana.

lub

Jeśli wiesz, że albo działa jako usługa GP (nie tylko przy użyciu Pythona serwera) w porównaniu z ID, możesz sprawdzić ścieżkę pliku arcpy.env.scratchFolder. Podczas typowej instalacji zawsze będzie wyglądał jak C: \ arcgisserver \ directories \ arcgisjobs \ [service] _gpserver \ [guid] \ ....

KHibma
źródło
I nie zapominaj, że ArcGIS Desktop 10.1 ma opcję instalacji 64-bitowego geoprzetwarzania w tle, które instaluje 64-bitowy Python.
MLowry
Czy ta metoda wywoływania ArcObjects z python nie pozwala na wywołanie RuntimeManager.ActiveRuntime ?
Kirk Kuykendall
2
RuntimeManagerto .NET, a nie obiekt COM.
Petr Krebs
C:\Program Files (x86)\Common Files\ArcGIS\bin\ArcGISVersion.dlljest biblioteką typów do załadowania, która ma wiele takich samych obiektów, możesz użyć jej z typów komputerów.
Jason Scheirer