I've written a python script that uses a Spatial Analyst function and hence requires the Spatial Analyst extension to be enabled. I would like to be able to check out the extension only if it hasn't already been manually checked out by the user (i.e. via the "Customize->Extensions" dialog).
There doesn't seem to be any way of testing whether the extension is already checked out out using
arcpy.CheckExtension as that returns
Available regardless of whether a license is already checked out or not (assuming there is a license available).
My code can check out the extension and then check it back in easily enough which is fine if the code is running outside of ArcGIS. However, this causes an issue in ArcGIS if a user has already checked the extension out manually via the "Customize->Extensions" dialog as they will suddenly start getting the "ERROR 000824: The tool is not licensed" or "ERROR 010096: There is no Spatial Analyst license currently available or enabled." errors when trying to use other Spatial Analyst tools/functions (as my code has checked the extension back in).
A further complication that may confuse the user is that when they open the "Customize->Extensions" dialog to check if the SA extension is checked out, the tick will still be in the extensions check box as checking the extension in via code does not update the dialog. E.g see screenshot below
My work around was to test using a simple spatial analyst tool (
Int(1)) in a
try:except: clause (see below), but that's just ugly.
from arcpy.sa import Int def sa_is_licensed(): try: Int(1) return True except (ExecuteError, RuntimeError) as e: # "ERROR 000824: The tool is not licensed" # "ERROR 010096: There is no Spatial Analyst license currently available or enabled." if 'ERROR 000824' in e.message or 'ERROR 010096' in e.message: if arcpy.CheckExtension('Spatial') == 'Available' and arcpy.CheckOutExtension('Spatial')=='CheckedOut': return False else:raise else:raise already_licensed = sa_is_licensed() # My big long script... if not already_licensed: arcpy.CheckInExtension('Spatial')
Are there any better ways to check from ArcPy if an ArcGIS extension has already been checked out?