为什么从scipy导入空间可以工作,而导入scipy后scipy.spatial不工作?

q0qdq0h2  于 2022-11-10  发布在  其他
关注(0)|答案(4)|浏览(151)

我想在我的代码中使用scipy.spatial.distance.cosine。如果我执行类似import scipy.spatialfrom scipy import spatial的操作,我可以导入spatial子模块,但如果我只是使用import scipy调用scipy.spatial.distance.cosine(...),则会导致以下错误:AttributeError: 'module' object has no attribute 'spatial' .
第二种方法有什么问题?

fv2wmkja

fv2wmkja1#

导入包不会自动导入子模块。您需要显式导入子模块。
例如,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'>

有一个例外,比如os.path。(os模块本身将子模块导入到它的命名空间中)

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

gudnpqoy2#

这是因为scipy是一个 package,而不是一个模块,当你导入一个包时,你实际上并没有加载里面的模块,因此package.module会导致一个错误。
但是,import package.module可以工作,因为它加载的是模块,而不是包。
这是大多数import语句的标准行为,但也有少数例外。
下面是Python 3中urllib的相同情况:

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

看到了吗?这里没有子模块。要访问它的子模块,我们需要子模块:

>>> import urllib.request
>>>

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

gfttwv5a

gfttwv5a3#

使用以下行导入:

import scipy.spatial # worked.

而不是

import scipy # not working

我试过了,成功了。

z2acfund

z2acfund4#

使用scipy 1.2.1版解决此问题......

相关问题