Verificando se o script python é executado no ArcGIS (arcmap ou no servidor) ou em um script python independente


8

Para fins de depuração, criei um condicional codificado que verifica se o script é executado como autônomo ou como uma ferramenta do ArcGIS. Existe alguma maneira de fugir disso em tempo de execução? por exemplo, alguma variável de ambiente, variável global, etc.

por exemplo

dryRun= 1
if dryRun:
    par= 'Hello'
else:
    par= arcpy.GetParameterAsText(0)
# Do something

Respostas:


19

Verifique sys.executable.

Na janela do Python:

>>> import sys
>>> sys.executable
'C:\\Program Files (x86)\\ArcGIS\\Desktop10.2\\bin\\ArcMap.exe'

e depois em Python.exe:

Python 2.7.3 (default, Apr 10 2012, 23:31:26) [MSC v.1500 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.executable
'C:\\Python27\\ArcGIS10.2\\python.exe'

Portanto, um simples if os.path.basename(sys.executable).lower() == 'python.exe'deve fazê-lo.


Obrigado, mas meu objetivo principal era verificar entre run run servidor vs. local (ou seja, como geoprocessamento serviço- eu acho que é o nome)
Mahdi

Acredito que sys.executableserá algo diferente quando executado como uma ferramenta de servidor também. Escreva um script de teste que tenha problemas arcpy.AddMessage("Executable: " + sys.executable)para confirmar.
Jason Scheirer

1

Se entendi sua pergunta corretamente, você deseja verificar se está executando um script como uma ferramenta de script ou não. Se estiver sendo executado como uma ferramenta de script, você deseja definir algumas variáveis ​​usando GetParameterAsText e, se estiver executando como autônomo, deseja usar algumas variáveis ​​codificadas, isso está correto? Nesse caso, você pode fazer o seguinte:

if len(sys.argv) > 1:
    #Assign input and output parameters for script tool
    par = arcpy.GetParameterAsText(0)
else:
    # Hard coded parameters for testing
    par = 'Hello'

Ao verificar o tamanho de sys.argv, você está determinando quantos parâmetros estão sendo passados ​​para o script. Sempre existe pelo menos um parâmetro (a localização do próprio script), portanto, se houver mais de um, você pode assumir que o ArcGIS os está enviando (a menos que você esteja passando argumentos de outro lugar).


bem, isso meio que funciona por enquanto b / c Eu não passo argumentos, mas existe alguma maneira mais "elegante"?
Mahdi

Se por elegante, você quer dizer mais curto, pode torná-lo uma linha só assim:par = arcpy.GetParameterAsText(0) if len(sys.argv) > 1 else 'Hello'
Paul

por "elegante", quero dizer algo como verificar uma variável de ambiente, etc. Não "elegante" no sentido de python. Por outro lado, enquanto eu mesmo uso muito essa estrutura, no caso em que estamos discutindo, provavelmente estamos definindo muitos parâmetros para o script, para que pequenos curtos não sejam realmente elegantes.
Mahdi

0

Uma maneira simples de fazer isso seria assim:

import arcpy
par = arcpy.GetParameterAsText(0)
if not par: #If no parameter has been passed, an empty string is returned
  par = 'Hello'

Eu não tentei isso antes, mas achei que isso geraria uma exceção, isso é definitivamente interessante ... ainda assim, não me permitirá religar parte da lógica do código com base na ferramenta independente vs.
Mahdi

O que mais você precisa alterar além dos parâmetros se o script for executado fora do ArcMap?
Paul
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.