从NumPy,matplotlib包导入python子模块有什么区别

时间:2014-04-03 14:24:40

标签: python python-2.7 numpy matplotlib

当我尝试使用pyplot中的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位于第二个示例中。我认为它与某种软件包和模块有关。但我对蟒蛇不是那么专业,因此要求回答。

2 个答案:

答案 0 :(得分:5)

对于权威性教程read this

但是对于你的具体情况,看起来就是这样:

每个基于目录的python模块(如matplotlibnumpy)都有一个__init__.py文件,用于确定带入模块顶级范围的内容。默认情况下(当__init__.py为空时),范围内没有任何内容。

但是,某些模块(如numpy)决定通过向__init__.py添加import语句将功能提升到顶层。这会将这些子模块纳入范围,即使您只是显式导入了numpy

要检查我们的假设,让我们来看看来源!

答案 1 :(得分:0)

似乎在模块的__init__.py中,当您编写语句时,它可以使用变量__all__来控制要在当前作用域中导入的变量或函数:{{ 1}};我认为它也适用于语法from modulename import *;在numpy的import modulename文件中,我找到以下代码:

__init__.py