为什么Python模块有时不会导入他们的子模块?

时间:2010-09-23 18:45:12

标签: python python-import

我想知道今天我想解释一些奇怪的东西。我不是100%肯定如何将这个问题作为一个问题,所以谷歌是不可能的。由于某些奇怪的原因,日志记录模块无法访问模块logging.handlers。如果你不相信我,请自己尝试一下:

>>> import logging
>>> logging.handlers
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'handlers'
>>> import logging.handlers
>>> logging.handlers
<module 'logging.handlers' from '/usr/lib/python2.6/logging/handlers.pyc'>

有人可以解释为什么会这样吗?

4 个答案:

答案 0 :(得分:93)

在Python中,模块需要在可访问之前导入。 import logging仅导入日志记录模块。碰巧logging是一个包含子模块的包,但这些子模块仍然没有自动加载。因此,您需要先显式导入logging.handlers,然后才能访问它。

如果你想知道为什么它看起来有时你不需要那些额外的导入:一些包在导入时导入它们的部分或全部子模块 - 只需在它们的__init__.py文件中进行这些导入。在其他情况下,可能是您导入的其他内容,也导入了logging.handlers。导入哪一段代码无关紧要;只要您的流程中的某些在您访问之前导入logging.handlers,它就会存在。有时,看起来像包的模块不是一个,如osos.pathos不是软件包,只是导入正确的其他模块(针对您的平台)并将其称为path,这样您就可以os.path访问它。

答案 1 :(得分:3)

我也是python的新手,经过大量练习后我可以区分, 包(文件夹),模块(.py),类,变量......等等......

如果你想让你的任何文件夹成为python包 - 它必须包含__init__.py文件,即使空文件也会这样做!!!

正如托马斯所说,如果你愿意,你可以在__init__.p y导入额外的模块!但模块/包只有在导入后才能访问......

如果您想从可以使用的模块导入所有内容

from logging import *

休息你也可以访问下面的处理程序模块,

from logging import handlers
print dir(handlers)

答案 2 :(得分:1)

我最近遇到了同样奇怪的情况。所以,我打赌你已经删除了一些第三方lib导入。删除了包含的lib from logging import handlersfrom logging import *并为您提供handlers。在其他剧本中,你有import logging之类的东西,并且只使用了logging.handlers,而且你认为这是我工作的方式。

答案 3 :(得分:1)

Thomas Wouters很好地回答了这个问题,但是,我只是在原始文档中找到答案后才发现这个问题。为此,我认为我希望对此加以补充,以期将来它能更接近搜索引擎的顶部。

问题

  

为什么会出错:' AttributeError:模块' module_name '没有属性' sub_module_name '   尽管我的编辑器(例如Visual Code)自动完成了子模块   名称:

 import module_name
 module_name.sub_module_name(parameter)

答案

  

您的编辑器将自动完成功能基于项目的文件结构,而不是基于Python行为。子模块不是   导入模块时“自动”导入。有关使用

时如何“自动”导入子模块的详细信息,请参考Python Documentation
 import module_name

此答案的主要贡献是在尝试导入“模块”或“包”时添加了AttributeError

希望这对某人有帮助!