import arcpy tramples datetime import

6361
23
07-14-2016 11:14 AM
FredSpataro
Occasional Contributor III

I've never seen anything that states arcpy should/must be imported first in order to not override other system modules.  I only skimmed this document but didn't see anything specific, although their examples tend to imply it.  However if you do a import-from on datetime BEFORE importing arcpy, then you're datetime import will be destroyed:

>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2016, 7, 14, 12, 10, 12, 433000)
>>> import arcpy
>>> datetime.now()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'now'
>>> 

Either import datetime after arcpy or use the import-from-as syntax and give datetime an alias.

Tags (1)
23 Replies
JoshuaBixby
MVP Esteemed Contributor

Unfortunately, selectively importing classes or functions won't address the issue for Damon

Python 3.6.10 |Anaconda, Inc.| (default, May 20 2020, 01:49:13) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from datetime import datetime
>>> datetime.now()
datetime.datetime(2020, 9, 18, 8, 13, 54, 315215)
>>>
>>> from arcpy.management import CreateTable
>>> datetime.now()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: module 'datetime' has no attribute 'now'
>>> 

because dependencies within arcpy submodules end up loading nearly all (if not all) the modules anyways:

Python 3.6.10 |Anaconda, Inc.| (default, May 20 2020, 01:49:13) [MSC v.1916 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print(*(mod for mod in sys.modules.keys() if mod.startswith('arc')), sep='\n')

>>> from arcpy.management import CreateTable
>>> print(*(mod for mod in sys.modules.keys() if mod.startswith('arc')), sep='\n')
arcpy
arcpy.geoprocessing
arcpy.geoprocessing._base
arcgisscripting
arcgisscripting._arcgisscripting
arcpy.toolbox
arcpy.ddd
arcpy.arcobjects
arcpy.arcobjects._base
arcpy.arcobjects.arcobjectconversion
arcpy.arcobjects.arcobjects
arcpy.arcobjects.mixins
arcpy.arcobjects.geometries
arcpy._mp
arcpy.pdfdocument
arcpy.utils
arcpy._symbology
arcpy._renderer
arcpy._colorizer
arcpy.metadata
arcpy.reviewer
arcpy.agolservices
arcpy.analysis
arcpy.aviation
arcpy.ba
arcpy.ca
arcpy.cartography
arcpy.conversion
arcpy.defense
arcpy.edit
arcpy.ga
arcpy._ga
arcpy._base
arcpy.gapro
arcpy.geoanalytics
arcpy.geocoding
arcpy._geocoding
arcpy.indoors
arcpy.intelligence
arcpy.locref
arcpy.lr
arcpy.management
arcpy.maritime
arcpy.md
arcpy.na
arcpy._na
arcpy._na._solvers
arcpy._na._sas
arcpy._na._rs
arcpy._na._odcms
arcpy._na._vrps
arcpy._na._cfs
arcpy._na._las
arcpy._na._nds
arcpy.nd
arcpy.parcel
arcpy.ra
arcpy.server
arcpy.sfa
arcpy.stats
arcpy.stpm
arcpy.td
arcpy.tn
arcpy.topographic
arcpy.un
arcpy.wmx
arcpy._wmx
arcpy_wmx
arcpy_wmx._arcpy_wmx
arcpy.interop
arcpy.da
arcpy.mp
arcpy.sharing
arcpy._chart
arcpy.nax
arcpy.sa
arcpy.sa.Raster
arcpy.sa.Utils
arcpy.sa.Functions
arcpy.sa.ParameterClasses
arcpy.sa.CompoundParameter
arcpy.ia
arcpy.ia.Functions
arcpy.ia._ia
arcpy.ia.util
arcpy.ia.RasterToXarray
arcpy.ia.raster_functions
arcpy.ia.RasterCollection
arcpy.ia.PixelBlockCollection
arcpy.time
arcpy._utbx
arcpy.cmanagers
arcpy.cmanagers.EnvManager
>>>
0 Kudos
DanPatterson
MVP Esteemed Contributor

Welll, putting the garden away for the winter, of course leads to a solution

from datetime import datetime as thyme

dir(thyme)
['__add__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__ne__', '__new__', '__radd__', '__reduce__', '__reduce_ex__', '__repr__', '__rsub__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', 'astimezone', 'combine', 'ctime', 'date', 'day', 'dst', 'fold', 'fromordinal', 'fromtimestamp', 'hour', 'isocalendar', 'isoformat', 'isoweekday', 'max', 'microsecond', 'min', 'minute', 'month', 'now', 'replace', 'resolution', 'second', 'strftime', 'strptime', 'time', 'timestamp', 'timetuple', 'timetz', 'today', 'toordinal', 'tzinfo', 'tzname', 'utcfromtimestamp', 'utcnow', 'utcoffset', 'utctimetuple', 'weekday', 'year']

thyme.now()
datetime.datetime(2020, 9, 18, 14, 53, 50, 566500)

from arcpy.management import CreateTable

thyme.now()
datetime.datetime(2020, 9, 18, 14, 54, 22, 867106)

Nothing spices up your coding as a workaround


... sort of retired...
0 Kudos
JoshuaBixby
MVP Esteemed Contributor

Given that the module and class names are the same, i.e., datetime, I think that is one reason you see a lot of people import the class and rename it, like what you suggest.  I know 'dt' is very common alias for datetime class.

0 Kudos
DamonPettitt
Occasional Contributor

So i tried the alias route (and appreciate the spice puns), but then something else didn't work later in the code.  So I ultimately opted to simply import the datetime stuff after arcpy.

And pardon the ignorance, so does this mean that arcpy has a class somewhere called datetime?  I understand that arcpy is clobbering the namespace, but I'm unclear as to why.  And wouldn't importing datetime after arcpy mean that datetime is potentially clobbering something for arcpy?

0 Kudos