Any reason why this wouldn't be working?
import arcpy
import os
basedir = 'C:\\Temp'
gdb_name = 'TestGDB'
gdb = os.path.join(basedir, gdb_name)
if arcpy.Exists(gdb):
arcpy.env.workspace = gdb
else:
gdb = arcpy.CreateFileGDB_management(basedir, gdb_name)
arcpy.env.workspace = gdb
I must not be understanding how .Exists() resolves, for if the gdb already exists, it gives me:
arcgisscripting.ExecuteError: ERROR 000258: Output C:\Temp\TestGDB.gdb already exists
Failed to execute (CreateFileGDB)
If the gdb does not exist, it gives me:
RuntimeError: Object: Error in accessing environment <workspace>
Solved! Go to Solution.
Can you check to make sure it creates the GDB? I think its not creating it at all.
Make line 11 just:
arcpy.CreateFileGDB_management(basedir, gdb_name)
Right now instead of creating the actual gdb, you are setting a variable equal to it, which I'm not sure what that would do but it likely isn't creating it.
When creating the file geodatabase path for setting a workspace, you need to include the ".gdb" on the end, otherwise you are setting the workspace to a folder.
Thanks Ian/Joshua,
When I include the .gdb extension (gdb_name = 'TestGDB.gdb') and the geodatabase exists, it completes. When the geodatabase does not exist, it creates the TestGDB.gdb object, but still gives me the same runtime error.
Can you check to make sure it creates the GDB? I think its not creating it at all.
Make line 11 just:
arcpy.CreateFileGDB_management(basedir, gdb_name)
Right now instead of creating the actual gdb, you are setting a variable equal to it, which I'm not sure what that would do but it likely isn't creating it.
Thanks Ian. It felt like I should be able to dump the method into a variable in one step like other methods to save a line of code, but regardless, it works now, thank you.
Hm it does create the GDB when you set it equal to a variable. I guess the issue with your script is the fact that arcpy.env.workspace is looking for a workspace as an input, whereas you were setting it equal to geoprocessing operation that creates the workspace.
Just to provide more insight, if you print the gdb variable, you'll get "<basedir>\<gdb_name>". The OS separator between the out file path and FGDB name isn't escaped properly, as it's set to a backslash, which is why you see that runtime error when trying to use the gdb variable as is. In one line, this worked:
gdb = str(arcpy.CreateFileGDB_management(outDir,outName)).replace("\\","/")
You can replace the single backslash, (escaped with a double backslash), with a forward slash.
I am using ArcGIS 10.5, and Create File GDB returns properly escaped results:
>>> var = arcpy.CreateFileGDB_management(r'C:\tmp','test')
>>> var
<Result 'C:\\tmp\\test.gdb'>
>>> arcpy.Exists(var)
True
>>>
The double backslashes are perfectly valid, they don't have to be forward slashes.
If you call on the variable without printing, it'll be correct as a Result object. If you print the variable you'll see the backslash is not escaped:
>>> gdb = arcpy.CreateFileGDB_management("C:/Temp","blah.gdb")
>>> gdb
<Result 'C:/Temp\\blah.gdb'>
>>> print(gdb)
C:/Temp\blah.gdb
>>> arcpy.Exists(gdb)
True
>>> arcpy.env.workspace = gdb
Runtime error
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "c:\program files (x86)\arcgis\desktop10.5\arcpy\arcpy\geoprocessing\_base.py", line 541, in set_
self[env] = val
File "c:\program files (x86)\arcgis\desktop10.5\arcpy\arcpy\geoprocessing\_base.py", line 601, in __setitem__
ret_ = setattr(self._gp, item, value)
RuntimeError: Object: Error in accessing environment <workspace>
>>> arcpy.env.workspace = str(gdb).replace("\\","/")
>>> arcpy.env.workspace
u'C:/Temp/blah.gdb'
There seems to be different implementations of arcpy.Exists and arcpy.env.workspace, as the latter seems to look at the result as a string.