导入整个python模块不允许使用子模块

时间:2016-07-01 11:13:49

标签: python numpy import module scikit-learn

我的问题是特定于scikit-learn python模块,但我也遇到了与matplotlib类似的问题。

当我想使用sklearn时,如果我只是执行'import sklearn'然后调用我需要的任何子模块,比如'sklearn.preprocessing.scale()',我会收到错误 “AttributeError:'module'对象没有属性'预处理'”

另一方面,当我从'sklearn import preprocessing'做' 然后使用'preprocessing.scale()'它正常工作。

当我使用像Numpy这样的其他模块时,仅仅'导入numpy'就足够了,而且效果很好。

因此,我想问一下是否有人可以告诉我为什么会这样,以及我做错了什么?

感谢。

2 个答案:

答案 0 :(得分:2)

python包在目录中的__init__.py文件中定义。 此文件确定子模块是否包含。

执行import sklearn时,python找到文件sklearn/__init__.py并执行它以创建sklearn模块。此对象绑定到名称sklearn解释器不会隐式导入子模块。

然而,在执行from sklearn import preprocessing时,python将首先像以前一样加载sklearn模块。然后它将检查preprocessing是否是该模块的属性(例如函数),如果不是,它将查找文件sklearn/preprocessing.py并将该模块也压缩。

恰好numpy在其__init__.py文件中执行以下操作:

import .random

因此,当将numpy导入为import numpy时,该模块的执行会触发导入numpy.random,然后将其添加为属性。

这很有用,因为有时候你只想使用一部分包而加载所有包可能需要很长时间。例如,导入numpy 需要花费半秒钟的时间。如果您只需要一小部分功能,这就浪费了时间。

您可能有兴趣阅读documentation for packages

答案 1 :(得分:1)

Numpy可以方便地在其__init__.py文件中导入其子模块,并将其添加到__all__。在使用图书馆时,你无能为力 - 无论是否成功。 sklearn显然没有。