Why does from scipy import spatial work, while scipy.spatial doesn't work after import scipy?

python, scipy

Solution

Importing a package does not import submodule automatically. You need to import submodule explicitly.

For example, `import xml` does not import the submodule `xml.dom`

>>> import xml
>>> xml.dom
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'dom'
>>> import xml.dom
>>> xml.dom
<module 'xml.dom' from 'C:\Python27\lib\xml\dom\__init__.pyc'>

There's an exception like `os.path`. (`os` module itself import the submodule into its namespace)

>>> import os
>>> os.path
<module 'ntpath' from 'C:\Python27\lib\ntpath.pyc'>

Problem

I would like to use `scipy.spatial.distance.cosine` in my code. I can import the `spatial` submodule if I do something like `import scipy.spatial` or `from scipy import spatial`, but if I simply `import scipy` calling `scipy.spatial.distance.cosine(...)` results in the following error: `AttributeError: 'module' object has no attribute 'spatial'`. What is wrong with the second approach?

Original source

Related problems