Como chamo arquivos externos no Serviço de Geoprocessamento Python?

8

Eu criei um script Python que chama um script R e, em seguida, lê a saída novamente no Python. Eu posso executar esta ferramenta no ArcGIS Desktop (10.2.1) e funciona bem. Quando publico como serviço de geoprocessamento, ele falha quando atinge o script R. Eu verifiquei os caminhos dos arquivos e eles estão bem. É possível chamar scripts externos de um serviço de geoprocessamento? Aqui está o meu código.

import sys, os, arcpy
arcpy.AddMessage("Loaded Python Imports...")

try:
#User Input
lat = arcpy.GetParameterAsText(0)
long = arcpy.GetParameterAsText(1)

arcpy.AddMessage("LAT: " + "".join(lat))
arcpy.AddMessage("LONG: " + "".join(long))

#Create R Command
rScript = "test.R"
args = " ".join([lat, long])
RCMD = "R --slave --vanilla --args "
cmd = RCMD + args + " < " + rScript

#Execute
os.system(cmd)

#Render the Results
output = open("FILE PATH")
finalNumber = output.read()
print("The output is: " + " ".join(finalNumber))
arcpy.AddMessage("The output is: " + " ".join(finalNumber))
output.close()

#Delete Text File
os.remove("FILE PATH")

except Exception as e:
    print e.message
    arcpy.AddError(e.message)
Jeremy Hamm
fonte
Não sei qual versão do servidor ArcGIS você está usando e não conheço a configuração do seu sistema, mas um pensamento é que, pelo menos com a configuração mais antiga do ArcGIS Server, v10.0 e mais antiga, qualquer serviço executado geralmente são executados em uma conta de usuário dedicada (usuários do SOM & SOC, etc.). Não sei como suas permissões são configuradas, mas eu entraria em contato com seu servidor / administrador da Web, se não você, e descobriria qual usuário está sendo usado para executar o serviço e se esse usuário tem todas as permissões necessárias para acessar todos os os programas e arquivos envolvidos. Além disso, você o testou no ArcDesktop a partir do servidor?
John
Estou usando o ArcGIS Server 10.2.1 e sou o administrador da web. Testamos as permissões e esse não é o problema. A ferramenta funciona no ArcGIS Desktop no servidor, mas não como um serviço de geoprocessamento. Quando a ferramenta é executada na área de trabalho, uma janela do console do R aparece e mostra os processos do R. Não vejo isso ao executar o serviço. Eu sei que o R está instalado no servidor, pois podemos executar a ferramenta na área de trabalho do ArcGIS. Bem, eu acho que tudo o que há a fazer é continuar a resolver
Jeremy Hamm
Não sei nada sobre esse problema específico, mas você tentou usar algo parecido Rscript test.R arg1 arg2 arg3? Para o caso de você não estar ciente dessa opção, aqui está um exemplo simples de como isso se parece na prática.
Josh O'Brien
Sim, eu não acho que o problema esteja no próprio script R. Quando executo o serviço de geoprocessamento no ArcMap, ele falha antes de o script R ser chamado ou ao tentar chamá-lo. Eu sei que o R está instalado no servidor. Estou realmente perplexo por isso ...
Jeremy Hamm
OK boa sorte. Se você descobrir isso, poste a resposta aqui.
Josh O'Brien

Respostas:

2

Eu encontrei este artigo: Integrando programas externos no ModelBuilder , é mais antigo e inicialmente parece estar fora do tópico, mas se você olhar para isso insira a descrição da imagem aqui:, poderá ver que ele define explicitamente o caminho para o script R.

Quando seu script de geoprocessamento é executado no servidor, ele é executado em uma pasta de trabalho dentro do jobsdiretório. Dependendo do processo de publicação, seu script R pode não estar lá. Sempre que me refiro a scripts externos nos meus serviços de geoprocessamento, sempre os refiro explicitamente a partir de uma pasta que foi registrada como uma fonte de dados .

pgreen2
fonte
Na verdade, usei um método semelhante a esse, mas não a rota de um serviço de geoprocessamento. O script python executa o código R e lê o arquivo de texto de saída do script R. Esta foi a forma mais eficiente para executar nosso modelo e retorno resultados
Jeremy Hamm
1

Você precisará usar a estrutura da ferramenta ESRI e incluir os arquivos na pasta de script se desejar referenciá-los diretamente pelo nome, como está fazendo no seu código. http://resources.esri.com/help/9.3/ArcGISDesktop/com/Gp_ToolRef/sharing_tools_and_toolboxes/a_structure_for_sharing_tools.htm

Caso contrário, você precisará anexar o local do script em seu sys.path. O exemplo abaixo faz referência ao arquivo "\ myFolder \ myModules \ myExtFile.py". Depois de ter uma referência válida ao seu arquivo, você pode usar suas funções personalizadas no serviço GP, desde que o local da publicação tenha acesso ao caminho da pasta.

import sys, arcpy
sys.path.append(r'\\myFolder\myModules')

import myExtFile as extFile

if __name__ == '__main__':
    # Get values from ESRI
    param1 = arcpy.GetParameterAsText(0)

    # Use custom python library
    myVal = extFile.someFunc(param1)
Adio3012
fonte