发布
社区首页 >问答首页 >从NumPy、matplotlib包导入python子模块有什么区别?

从NumPy、matplotlib包导入python子模块有什么区别?
EN

Stack Overflow用户
提问于 2014-04-03 14:24:39
回答 2查看 1.2K关注 0票数 6

当我尝试使用来自matplotlibmatplotlib

代码语言:javascript
代码运行次数:0
复制
import matplotlib
print matplotlib.pyplot  # just checking

它给了我AttributeError: 'module' object has no attribute 'pyplot'

可以通过以下方式解决这一问题:

代码语言:javascript
代码运行次数:0
复制
import matplotlib.pyplot

但我真正困惑的是,

代码语言:javascript
代码运行次数:0
复制
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。我认为这与某种软件包和模块有关。但我对蟒蛇并不是那么专业,因此我想要一个答案。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-03 14:39:59

对于最终的教程,阅读这篇文章

但就你的具体情况而言,这似乎是正在发生的事情:

每个基于目录的python模块(比如matplotlibnumpy)都有一个__init__.py文件,它决定了模块顶层作用域中的内容。默认情况下(当__init__.py为空时),范围内没有任何内容。

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

为了检验我们的假设,让我们看看来源!

票数 6
EN

Stack Overflow用户

发布于 2014-04-03 15:11:49

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

代码语言:javascript
代码运行次数:0
复制
__all__.extend(['linalg', 'fft', 'random', 'ctypeslib', 'ma'])
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22840671

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档