为什么scipy导入空间工作,而scipy.spatial在导入scipy后不起作用?

Pau*_*scu 16 python scipy

我想scipy.spatial.distance.cosine在我的代码中使用.我可以导入的spatial子模块,如果我这样做import scipy.spatialfrom scipy import spatial,但如果我只是import scipy调用scipy.spatial.distance.cosine(...)下面的错误结果:AttributeError: 'module' object has no attribute 'spatial'.

第二种方法有什么问题?

fal*_*tru 21

导入包不会自动导入子模块.您需要显式导入子模块.

例如,import xml不导入子模块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'>
Run Code Online (Sandbox Code Playgroud)

有一个例外os.path.(os模块本身将子模块导入其命名空间)

>>> import os
>>> os.path
<module 'ntpath' from 'C:\Python27\lib\ntpath.pyc'>
Run Code Online (Sandbox Code Playgroud)


aIK*_*Kid 7

那是因为scipy是一个,而不是一个模块.导入包时,实际上并未在内部加载模块,从而package.module导致错误.

但是,import package.module会工作,因为它加载模块,而不是包.

这是大多数import语句的标准行为,但也有一些例外.

这是urllibPython 3中的相同情况:

>>> import urllib
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', '__loader__', '__name__', '__package__', '__path__', 'error', 'parse', 'request', 'response']
Run Code Online (Sandbox Code Playgroud)

看到?那里没有子模块.要访问其子模块,我们要求子模块:

>>> import urllib.request
>>> 
Run Code Online (Sandbox Code Playgroud)

希望这个简单的解释有所帮