Comment appeler des fichiers externes dans le service de géotraitement Python?

8

J'ai créé un script Python qui appelle un script R et lit ensuite la sortie en Python. Je peux exécuter cet outil dans ArcGIS Desktop (10.2.1) et cela fonctionne très bien. Lorsque je publie en tant que service de géotraitement, il échoue une fois qu'il a atteint le script R. J'ai vérifié les chemins de fichiers et ils vont bien. Est-il même possible d'appeler des scripts externes à partir d'un service de géotraitement? Voici mon code.

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
la source
Je ne sais pas quelle version d'ArcGIS Server vous utilisez et je ne connais pas la configuration de votre système, mais une pensée est que, au moins avec l'ancienne configuration d'ArcGIS Server, v10.0 et plus ancienne, tout service exécuté serait être généralement géré via un compte utilisateur dédié (utilisateurs SOM & SOC, etc ....). Je ne sais pas comment vos autorisations sont configurées, mais j'obtiendrais avec votre serveur / administrateur Web si ce n'est pas vous et je déterminerais quel utilisateur est utilisé pour exécuter le service et si cet utilisateur dispose de toutes les autorisations nécessaires pour accéder à tous les programmes et fichiers concernés. De plus, l'avez-vous testé dans ArcDesktop à partir du serveur?
John
J'utilise ArcGIS Server 10.2.1 et je suis l'administrateur Web. Nous avons testé les autorisations et ce n'est pas le problème. L'outil fonctionne dans ArcGIS Desktop sur le serveur, mais pas en tant que service de géotraitement. Lorsque l'outil est exécuté à partir du bureau, une fenêtre de console R apparaît et affiche les processus R. Je ne vois pas cela lors de l'exécution du service. Je sais que R est installé sur le serveur car nous pouvons exécuter l'outil sur le bureau ArcGIS. Eh bien, je suppose que tout ce qu'il y a à faire est de continuer à dépanner
Jeremy Hamm
Je ne sais rien de ce problème particulier, mais avez-vous essayé d'utiliser quelque chose comme à la Rscript test.R arg1 arg2 arg3place? Juste au cas où vous ne seriez pas au courant de cette option, voici un exemple simple de ce à quoi cela ressemble dans la pratique.
Josh O'Brien
Oui, je ne pense pas que le problème soit avec le script R lui-même. Lorsque j'exécute le service de géotraitement dans ArcMap, il échoue avant l'appel du script R ou lors de la tentative d'appel du script. Je sais que R est installé sur le serveur. Je suis vraiment perplexe par cela ...
Jeremy Hamm
D'accord bonne chance. Si vous comprenez cela, veuillez poster la réponse ici.
Josh O'Brien

Réponses:

2

J'ai trouvé cet article: Intégrer des programmes externes dans ModelBuilder , il est plus ancien et semble initialement hors sujet, mais si vous regardez ceci:, entrez la description de l'image icivous pouvez voir qu'il définit explicitement le chemin d'accès au script R.

Lorsque votre script de géotraitement s'exécute sur le serveur, il s'exécute dans un dossier de travail dans le jobsrépertoire. Selon le processus de publication, votre script R peut ne pas y être. Chaque fois que je fais référence à un script externe au sein de mes services de géotraitement, je m'y réfère toujours explicitement à partir d'un dossier qui a été enregistré en tant que source de données .

pgreen2
la source
J'ai en fait utilisé une méthode similaire à celle-ci mais pas la route d'un service de géotraitement. Le script python exécute le code R et lit le fichier texte de sortie à partir du script R. C'était le moyen le plus efficace d'exécuter notre modèle et de renvoyer les résultats
Jeremy Hamm
1

Vous devrez utiliser la structure de l'outil ESRI et inclure les fichiers dans votre dossier de script si vous souhaitez les référencer directement par leur nom comme vous le faites dans votre code. http://resources.esri.com/help/9.3/ArcGISDesktop/com/Gp_ToolRef/sharing_tools_and_toolboxes/a_structure_for_sharing_tools.htm

Sinon, vous devrez ajouter l'emplacement du script dans votre sys.path. L'exemple ci-dessous fait référence au fichier "\ myFolder \ myModules \ myExtFile.py". Une fois que vous avez une référence valide à votre fichier, vous pouvez utiliser vos fonctions personnalisées dans le service GP tant que l'endroit où vous publiez a accès au chemin du dossier.

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
la source