I am copying GDB extensions from XML templates.
I am making a Python Toolbox from a Python script that runs perfectly if I run it alone using Python IDLE.
Now when running the tool it works fine except for the last, where I import the XML to overlay the GDB I created.
I get the error:
Traceback (most recent call last):
File "<string>", line 282, in execute
File "c:\program files (x86)\arcgis\desktop10.4\arcpy\arcpy\management.py", line 1196, in ImportXMLWorkspaceDocument
raise e
ExecuteError: Failed to execute. Parameters are not valid.
ERROR 000824: The tool is not licensed.
Failed to execute (ImportXMLWorkspaceDocument).
I suspect I do not have a license for the ImportXMLWorkspaceDocument.
I understand I can check with 'arcpy.CheckExtension' and if there is one I can use 'arcpy.CheckOutExtension' and 'arcpy.CheckInExtension'
But what group is ImportXMLWorkspaceDocument part of? Is it 'Spatial'? 'Datareviewer'? or what?
I have the list but don't know what part ImportXMLWorkspaceDocument belongs to.
Thanks.
Solved! Go to Solution.
You don't need to check out an extension, you need to ensure your ArcMap/Catalog is using a standard (aka arceditor) or advanced (aka arcinfo) level license, see Import XML Workspace Document—Help | ArcGIS for Desktop
In your python toolbox, use the arcpy.ProductInfo() function in the "isLicensed" method in your tool to disable the tool if ArcMap/Catalog is using a basic/arcview license.
import arcpy class Toolbox(object): def __init__(self): self.label = "Toolbox" self.alias = "" # List of tool classes associated with this toolbox self.tools = [Tool] class Tool(object): init code etc... def isLicensed(self): """Set whether tool is licensed to execute.""" return arcpy.ProductInfo() != u'ArcView'
The reason your code works when run from Python/IDLE is that when you import arcpy *from outside ArcGIS*, it will automatically grab the highest available license level (i.e it will try advanced if available, standard if not or basic if all else fails). You can specify what license level you want by using "import arcview, arcpy" or "import arceditor, arcpy" etc... NOTE: You can not use this method in your tool to change your current license level*
*You might be able to work around this by ensuring the script is run outside of the current ArcGIS process (maybe using background geoprocessing, or the subprocess module to force a new python process), and then setting your license level in the script to standard or advanced.
You don't need to check out an extension, you need to ensure your ArcMap/Catalog is using a standard (aka arceditor) or advanced (aka arcinfo) level license, see Import XML Workspace Document—Help | ArcGIS for Desktop
In your python toolbox, use the arcpy.ProductInfo() function in the "isLicensed" method in your tool to disable the tool if ArcMap/Catalog is using a basic/arcview license.
import arcpy class Toolbox(object): def __init__(self): self.label = "Toolbox" self.alias = "" # List of tool classes associated with this toolbox self.tools = [Tool] class Tool(object): init code etc... def isLicensed(self): """Set whether tool is licensed to execute.""" return arcpy.ProductInfo() != u'ArcView'
The reason your code works when run from Python/IDLE is that when you import arcpy *from outside ArcGIS*, it will automatically grab the highest available license level (i.e it will try advanced if available, standard if not or basic if all else fails). You can specify what license level you want by using "import arcview, arcpy" or "import arceditor, arcpy" etc... NOTE: You can not use this method in your tool to change your current license level*
*You might be able to work around this by ensuring the script is run outside of the current ArcGIS process (maybe using background geoprocessing, or the subprocess module to force a new python process), and then setting your license level in the script to standard or advanced.
Ok, I find we don't have the advanced licenses and thus running it strait by python tools won't do.
So, since it works perfectly outside using python IDLE how does one set the parameters in the tools and then 'batch' it to run? That is using the same pyt script I have in the toolbox to input all the parameters and then send them to a batch .py script to run with IDLE?
Thanks,
Paul
There are only two possibilities:
You may be having trouble switching from a basic to a standard or advanced license.
Ok I got it to work.
What I did was:
Make the tool create a batch .bat file with the command to run the python 2.7 and the python script to do all the processing.
Then the tool gets all the parameters via the def getParameterInfo, and uses a python template program minus the parameters.
As it creates a new temporary python script it adds the parameters to the script.
Then using subprocess.call (one uses 'import subprocess' to get access to it) run the bat file with the new temporary python script.
It created everything I desired. So the ArcMap we have does not have the advanced license but the python 2.7 under ArcGIS does!
Thanks,
Paul