Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么从scipy导入空间工作,而scipy.spatial不';导入scipy后无法工作?_Python_Scipy - Fatal编程技术网

Python 为什么从scipy导入空间工作,而scipy.spatial不';导入scipy后无法工作?

Python 为什么从scipy导入空间工作,而scipy.spatial不';导入scipy后无法工作?,python,scipy,Python,Scipy,我想在我的代码中使用scipy.space.distance.cosine。如果我执行类似于从scipy导入空间的import scipy.spatial或操作,我可以导入spatial子模块,但是如果我只是调用scipy.spatial.distance.cosine(…)导致以下错误:AttributeError:“module”对象没有属性“spatial” 第二种方法有什么问题?这是因为scipy是一个包,而不是一个模块。当您导入一个包时,实际上并没有加载其中的模块,因此package.

我想在我的代码中使用
scipy.space.distance.cosine
。如果我执行类似于从scipy导入空间的
import scipy.spatial
操作,我可以导入
spatial
子模块,但是如果我只是调用
scipy.spatial.distance.cosine(…)
导致以下错误:
AttributeError:“module”对象没有属性“spatial”

第二种方法有什么问题?

这是因为scipy是一个包,而不是一个模块。当您导入一个包时,实际上并没有加载其中的模块,因此
package.module
会导致错误

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

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

Python 3中的
urllib
的情况与此相同:

>>> import urllib
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', '__loader__', '__name__', '__package__', '__path__', 'error', 'parse', 'request', 'response']
看到了吗?那里没有子模块。要访问其子模块,我们需要子模块:

>>> import urllib.request
>>> 

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

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

例如,
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'>

使用scipy版本1.2.1解决此问题……

@alKid和@falsetru给出了很好的答案,您应该接受其中一个。为了解释为什么在
scipy
中会出现这种情况,我们之所以不导入所有子包,是因为其中有很多子包,而且许多子包都有大型扩展模块,需要花费大量的加载时间。大多数程序不需要加载所有的scipy,因此如果我们总是导入所有的子包,那么会给所有程序增加很多额外的开销。由“alKid”和“falsetru”给出的答案在事实上并不正确,而且会产生误导。原因在于包的init文件。scipy的init不导入其模块,而其他一些包(如numpy)的init导入其模块。在重复的线程中查看更好的答案:始终详细说明您的答案。在这种情况下,您可以说1.2.1版本中有哪些改进,或者修复了bug,等等。欢迎使用SO。不幸的是,你的回答都没有回答OP的问题“第二种方法有什么问题?”而且是不正确的。即使使用scipy 1.4.1,第二种方法仍然会导致属性错误:模块“scipy”没有属性“spatial”
>>> import os
>>> os.path
<module 'ntpath' from 'C:\Python27\lib\ntpath.pyc'>