Comment accéder à l'ID de travail actuel à partir du script de géotraitement exécuté sur le serveur esri?

8

Je souhaite accéder par programme à l'ID de tâche actuel d'un script de géotraitement exécuté sur ESRI 10.2. Le script est ce qui doit connaître l'ID du travail, pas l'appelant du script.

Lors de la recherche, j'ai vu de nombreux exemples de la façon dont la demande de travail soumise revient avec l'ID du travail. Ce n'est pas ce que je veux.

Dans mon script qui s'exécute sur le serveur, je veux inclure l'ID du travail dans les journaux, mais je n'ai pas trouvé comment obtenir le travail dans le script. J'ai d'abord vérifié arcpy.env, mais je n'ai rien vu. Où dois-je chercher ailleurs?

pgreen2
la source
2
Vous souhaitez que le service en cours d'exécution signale le jobId? Il n'y a rien d'exposé pour le faire. Vous pouvez utiliser le module «os» pour analyser les chemins et les récupérer à partir de là.
KHibma
1
C'est décevant. Je pensais dans le même sens que vous l'avez suggéré; merci d'avoir confirmé mes soupçons.
pgreen2
@KHibma, existe-t-il un moyen simple de déterminer si le script s'exécute sur le serveur ou via arcmap?
pgreen2
1
Comme Kevin l'a suggéré, je vous conseillerais d'essayer d'obtenir l'ID du travail en parcourant les dossiers créés dans le dossier arcgisserver / arcgisjobs. Vous voudrez peut-être voir quel dossier a été créé en dernier et obtenir son nom.
Alex Tereshenkov
@ pgreen2 consultez ce fil: gis.stackexchange.com/questions/64937/…
KHibma

Réponses:

6

Je me souvenais d'un vieux script que j'utilisais dans les tests, alors j'ai pensé que je partagerais. Peut-être que cela vous aidera, vous ou quelqu'un d'autre. J'ai ajouté la logique pour obtenir le GUID. Il y a probablement une meilleure façon de le faire, mais cela fonctionne.

import arcpy, sys, socket, os

theExe = sys.executable

arcpy.AddMessage("the executable    : " + theExe)
arcpy.AddMessage("where is arcpy    : " + str(arcpy.__file__))
arcpy.AddMessage("the install dir   : " + str(arcpy.GetInstallInfo()["InstallDir"]))
arcpy.AddMessage("the product is    : " + str(arcpy.GetInstallInfo()["ProductName"]))
arcpy.AddMessage("the py version is : " + str(sys.version))
arcpy.AddMessage("hostname          : " + str(socket.gethostname()))
arcpy.AddMessage("path              : " + str(sys.path[0]))
arcpy.AddMessage("path              : " + str(os.path.dirname(__file__)))
arcpy.AddMessage("working dir       : " + str(os.getcwd()))
scr = arcpy.env.scratchFolder
arcpy.AddMessage(scr)  
if "server" in theExe.lower():
    guid = os.path.split(os.path.split(scr)[0])[1] #split 'scratch' off, then split remainder and grab guid    
    arcpy.AddMessage(guid)

arcpy.AddMessage("--------------------------------")
arcpy.AddMessage(arcpy.ProductInfo())
arcpy.AddMessage(arcpy.GetInstallInfo())
KHibma
la source
3

Vous pouvez également utiliser arcpy.env.scratchWorkspace lors de son retour:

"e:\arcgisserver\directories\arcgisjobs\analysis\your_program\j83b20a86cc2d471cb684b4ce0aa9b81b\scratch"

Pour isoler l'ID du travail de la chaîne:

job_id = arcpy.env.scratchWorkspace.rsplit("\\", 2)[1]
>>>"j83b20a86cc2d471cb684b4ce0aa9b81b"
Tristan Forward
la source
C'est génial!
Alex Tereshenkov