o arcpy pode detectar se está sendo executado na área de trabalho ou no servidor?

9

Estou desenvolvendo um código que quero executar como um serviço da web do ArcGIS Server e como um script independente. Quero poder modificar a execução um pouco, dependendo de estar sendo executada como um serviço da web AGS ou como um python independente / no Desktop.

Existe uma maneira de detectar isso?

Eu fiz algumas pesquisas, mas não encontrei nada muito satisfatório. Eu já vi arcpy.mapping.CreateGISServerConnectionFile, mas isso define conexões com um servidor em vez de verificar o ambiente atual. Também procurei informações sobre como os serviços são executados com AGS (por exemplo, isso ), mas não vejo nada parecido com uma função do tipo arcpy.isWebService (). Eu só preciso verificar o ambiente (gostaria de ver se "% scratchFolder% foi definido ou examinando algo relacionado ao sys.argv)? Parece uma solução instável.

Roland
fonte

Respostas:

5

Sugeri isso, depois de examinar os resultados de sys.executable, arcpy.GetInstallInfo (), ListInstallations () e ProductInfo (), nenhum dos quais me deu uma boa resposta sobre qual arcpy eu estava executando. @KHibma, algo para a equipe do arcpy pensar - seria uma boa propriedade (arcpy.version - como sys.version).

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

Eu testei esse teste como uma função. Se você precisa conhecer os bits do Python, acho melhor testar o sys.version por conter "32 bits", para não incluí-lo. Desenterrar a versão do ArcGIS é um pouco mais de código, então fui em frente e incluí-o na função.

# 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 
Preço de Curtis
fonte
11
Portanto, parece que arcpy .__ file__, arcpy.GetInstallInfo () e arcpy.ProductInfo () produzirão informações semelhantes (mesmo que uma produz "Desktop" enquanto a outra produz "ArcInfo"). Eu estou pensando que a opção arcpy.ProductInfo () é a opção mais concisa e legível.
Roland
Não foi testado, mas as informações do produto podem fornecer o nível de licença mais alto disponível, se você não o importou especificamente com "import arceditor", por exemplo). Ou seja, se você tiver apenas o ArcEditor disponível, é isso que você provavelmente receberá de volta. Engraçado que Server não fazer a mesma coisa, uma vez que também oferece suporte a vários níveis de licença (Basic, Standard, Enterprise)
Curtis Price
Deve-se notar que este código Python assume que o software está instalado usando as convenções de nomenclatura de pastas normais. É muito raro alguém não usar o nome de pasta padrão "Desktop10.1" evn se puder mover o caminho (por exemplo, instalamos em "C: \ ArcGIS \ Desktop10.1".
Curtis Price
8

@KHibma e outros me fizeram pensar se eu poderia obter as informações usando o arcpy para verificar a versão. Eu procurei um pouco às cegas e acho que tenho algo, mesmo que não seja o que eu estava esperando. Ainda não verifiquei no AGS.

Produz um bom ditado:

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

Então eu posso dizer:

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

Obrigado por chutar isso por aí!

Roland
fonte
Só notei que isso volta como "Desktop" na versão 10.1, então locase melhor que a instrução if para usar d ['ProductName']. Lower ().
Roland
Você pode postar qual é o resultado no servidor? Pode ser útil para referência futura.
precisa
Definitivamente. Desculpe o atraso. Tive que passar pelo meu colega que executa a instalação do AGS. Sob 10.1, ele obteve "Servidor". Não temos uma instância 10.0 AGS, mas executar o resultado através de algum tipo de função de capitalização é provavelmente uma boa ideia.
Roland
Eu esqueci arcpy.GetInstallInfo (). Embora o objetivo não seja informar o que você está executando (ele age da mesma forma que o ListInstallations ... Eu acredito que ele só retorna engine | desktop quando executado a partir de 32 e server quando executado a partir de Python de 64 bits. re volta para 10,0 como mostra em sua mensagem, você terá tanto servidor e desktop para decidir
KHibma
2
@Roland, então testei mais algumas coisas depois de conversar com um colega. Eu não tenho 10.0 com DT / AGS no mesmo mecanismo, então não sei como isso vai acontecer, mas tente "arcpy.ProductInfo ()". Diz-lhe ArcInfo ou Arcserver ... isso realmente pode fazer isso por você, se você estiver executando no DT, ou o script como um serviço GP em AMBOS 10,0 e 10,1
KHibma
1
arcpy.ListInstallations()
[u'desktop', u'engine', u'server']

Assim, você pode verificar o que está instalado. No entanto, isso não o levará muito longe se o DT e o Server estiverem instalados na mesma máquina. Quanto a uma função que diz a você o que você está executando, não existe.

Pensando em voz alta: DT é de 32 bits, o servidor é de 64 bits. Você pode fazer um sys.path e inspecionar qual versão do Python está sendo usada.

ou

Se você souber que está sendo executado como um serviço GP (não apenas usando o python do servidor) vs DT, poderá inspecionar o caminho do arcpy.env.scratchFolder. Em uma instalação típica, sempre será algo como C: \ arcgisserver \ directory \ arcgisjobs \ [service] _gpserver \ [guid] \ ....

KHibma
fonte
E não esqueça que o ArcGIS Desktop 10.1 tem uma opção para instalar o geoprocessamento em segundo plano de 64 bits, que instala o Python de 64 bits.
MLowry
Esse método para chamar ArcObjects a partir de python não permite que você chame RuntimeManager.ActiveRuntime ?
precisa saber é o seguinte
2
RuntimeManageré .NET, não um objeto COM.
Petr Krebs
C:\Program Files (x86)\Common Files\ArcGIS\bin\ArcGISVersion.dllé uma biblioteca de tipos carregável que possui muitos dos mesmos objetos, você pode usá-la em comtypes.
Jason Scheirer