Wie rufe ich externe Dateien im Python Geoprocessing Service auf?

8

Ich habe ein Python-Skript erstellt, das ein R-Skript aufruft und dann die Ausgabe zurück in Python liest. Ich kann dieses Tool in ArcGIS Desktop (10.2.1) ausführen und es funktioniert einwandfrei. Wenn ich als Geoverarbeitungsdienst veröffentliche, schlägt dies fehl, sobald das R-Skript erreicht ist. Ich habe die Dateipfade überprüft und sie sind in Ordnung. Ist es überhaupt möglich, externe Skripte von einem Geoverarbeitungsdienst aufzurufen? Hier ist mein 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
quelle
Ich weiß nicht, welche Version von ArcGIS Server Sie verwenden, und ich kenne die Konfiguration Ihres Systems nicht. Ein Gedanke ist jedoch, dass zumindest mit der älteren ArcGIS Server-Konfiguration ab Version 10.0 alle Dienste ausgeführt werden in der Regel über ein dediziertes Benutzerkonto (SOM- und SOC-Benutzer usw.) ausgeführt werden. Ich weiß nicht, wie Ihre Berechtigungen eingerichtet sind, aber ich würde mit Ihrem Server / Webadministrator Kontakt aufnehmen, wenn nicht Sie und herausfinden, welcher Benutzer zum Ausführen des Dienstes verwendet wird und ob dieser Benutzer über alle Berechtigungen verfügt, die für den Zugriff auf alle erforderlich sind die beteiligten Programme und Dateien. Haben Sie es auch in ArcDesktop vom Server aus getestet?
John
Ich verwende ArcGIS Server 10.2.1 und bin der Webadministrator. Wir haben die Berechtigungen getestet und das ist nicht das Problem. Das Tool funktioniert in ArcGIS Desktop auf dem Server, jedoch nicht als Geoverarbeitungsdienst. Wenn das Tool vom Desktop ausgeführt wird, wird ein R-Konsolenfenster geöffnet, in dem die R-Prozesse angezeigt werden. Ich sehe dies nicht, wenn der Dienst ausgeführt wird. Ich weiß, dass R auf dem Server installiert ist, da wir das Tool auf dem ArcGIS-Desktop ausführen können. Nun, ich denke, alles was zu tun ist, ist weiter Fehler zu beheben
Jeremy Hamm
Ich weiß nichts über dieses spezielle Problem, aber haben Sie versucht, stattdessen so etwas zu Rscript test.R arg1 arg2 arg3verwenden? Für den Fall, dass Ihnen diese Option nicht bekannt war, finden Sie hier ein einfaches Beispiel dafür , wie dies in der Praxis aussieht.
Josh O'Brien
Ja, ich glaube nicht, dass das Problem beim R-Skript selbst liegt. Wenn ich den Geoverarbeitungsdienst in ArcMap ausführe, schlägt dies fehl, bevor das R-Skript aufgerufen wird oder während versucht wird, das Skript aufzurufen. Ich weiß, dass R auf dem Server installiert ist. Ich bin wirklich ratlos darüber ...
Jeremy Hamm
Ok viel Glück. Wenn Sie dies herausfinden, veröffentlichen Sie die Antwort bitte hier.
Josh O'Brien

Antworten:

2

Ich habe diesen Artikel gefunden: Die Integration externer Programme in ModelBuilder ist älter und sieht anfangs nicht zum Thema aus. Wenn Sie sich jedoch Folgendes ansehen: Geben Sie hier die Bildbeschreibung einSie können sehen, dass der Pfad zum R-Skript explizit festgelegt wird.

Wenn Ihr Geoverarbeitungsskript auf dem Server ausgeführt wird, wird es in einem Arbeitsordner im jobsVerzeichnis ausgeführt. Abhängig vom Veröffentlichungsprozess ist Ihr R-Skript möglicherweise nicht vorhanden. Wenn ich in meinen Geoverarbeitungsdiensten auf ein externes Skript verweise, verweise ich immer explizit auf diese aus einem Ordner, der als Datenquelle registriert wurde .

pgreen2
quelle
Ich habe tatsächlich eine ähnliche Methode verwendet, aber nicht die Route eines Geoverarbeitungsdienstes. Das Python-Skript führt den R-Code aus und liest die Ausgabetextdatei aus dem R-Skript ein. Dies war der effizienteste Weg, um unser Modell auszuführen und Ergebnisse zurückzugeben
Jeremy Hamm
1

Sie müssen die ESRI-Toolstruktur verwenden und die Dateien in Ihren Skriptordner aufnehmen, wenn Sie sie direkt nach Namen referenzieren möchten, wie Sie es in Ihrem Code tun. http://resources.esri.com/help/9.3/ArcGISDesktop/com/Gp_ToolRef/sharing_tools_and_toolboxes/a_structure_for_sharing_tools.htm

Andernfalls müssen Sie den Speicherort des Skripts in Ihrem sys.path anhängen. Das folgende Beispiel verweist auf die Datei "\ myFolder \ myModules \ myExtFile.py". Nachdem Sie einen gültigen Verweis auf Ihre Datei haben, können Sie Ihre benutzerdefinierten Funktionen im GP-Dienst verwenden, solange der Ort, an dem Sie veröffentlichen, Zugriff auf den Ordnerpfad hat.

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
quelle