Search code examples
pythonh2opy-datatable

Datatable installation from github failing to find the version


I have uninstalled and re-installed the latest version of datatable from the repo

16:42:49/seirdc2.March8.in $sudo pip3 install 'datatable==0.10.1' 
Successfully installed datatable-0.10.1

Let's see the version:

import datatable as dt
print(f'datatable version={dt.__version__}')

Um oops !

Traceback (most recent call last):
  File "/git/corona/python/pointr/experiments/python/datatable.py", line 18, in <module>
    import datatable as dt
  File "/git/corona/python/pointr/experiments/python/datatable.py", line 19, in <module>
    print(f'datatable version={dt.__version__}')
AttributeError: module 'datatable' has no attribute '__version__'

But why?

enter image description here

Note: I have seen other strangeness with this package: e.g. not finding Frame - though not consistently.


Solution

  • It appears that the problem has nothing to do with datatable. Look at the traceback:

    Traceback (most recent call last):
      File "/git/corona/python/pointr/experiments/python/datatable.py", line 18, in <module>
        import datatable as dt
      File "/git/corona/python/pointr/experiments/python/datatable.py", line 19, in <module>
        print(f'datatable version={dt.__version__}')
    AttributeError: module 'datatable' has no attribute '__version__'
    

    Doesn't it strike you as suspicious that you have line 18 "calling" line 19? I mean, how could it be? Here's how:

    When you name your script datatable.py and then do import datatable, then instead of importing the actual module from site-packages, it imports the "module" datatable.py instead. Basically, the file imports itself. And the way python manages imports, is that it creates a "stub" module in the sys.modules first (in order to prevent infinite recursions during imports). In your case, the module tries to import itself, so the stub module is fetched instead -- and then when you try to print its __version__ variable, turns out it doesn't exist.

    You can verify this by printing dt.__file__ instead, which should show the location of the file that is being imported.

    Needless to say, all this is not specific to datatable in any way; for example if you created a file numpy.py and then tried to import numpy, you'd run into same problems.