当我尝试使用来自matplotlib
的matplotlib
时
import matplotlib
print matplotlib.pyplot # just checking
它给了我AttributeError: 'module' object has no attribute 'pyplot'
可以通过以下方式解决这一问题:
import matplotlib.pyplot
但我真正困惑的是,
import numpy
print numpy.random
给我<module 'numpy.random' from '/Applications/Canopy.app/appdata/canopy-1.0.3.1262.macosx-x86_64/Canopy.app/Contents/lib/python2.7/site-packages/numpy/random/__init__.pyc'>
两种情况之间的区别是什么?在第一个示例中不能调用pyplot
,而在第二个示例中是random
。我认为这与某种软件包和模块有关。但我对蟒蛇并不是那么专业,因此我想要一个答案。
发布于 2014-04-03 14:39:59
对于最终的教程,阅读这篇文章。
但就你的具体情况而言,这似乎是正在发生的事情:
每个基于目录的python模块(比如matplotlib
和numpy
)都有一个__init__.py
文件,它决定了模块顶层作用域中的内容。默认情况下(当__init__.py
为空时),范围内没有任何内容。
然而,一些模块(如numpy
)决定通过向__init__.py
添加导入语句将功能提升到顶层。这会将这些子模块引入范围,即使您只显式导入了numpy
。
为了检验我们的假设,让我们看看来源!
__init__.py
不包括import pyplot
语句。__init__.py
确实包括了import random
,在第176行。发布于 2014-04-03 15:11:49
在模块的__init__.py
中,它似乎可以使用变量__all__
来控制在编写语句时要在当前作用域中导入的变量或函数:from modulename import *
;我认为它也适用于语法import modulename
;在numpy的__init__.py
文件中,我发现了以下代码:
__all__.extend(['linalg', 'fft', 'random', 'ctypeslib', 'ma'])
https://stackoverflow.com/questions/22840671
复制相似问题