繁体   English   中英

为什么Python模块有时不导入其子模块?

[英]Why do Python modules sometimes not import their sub-modules?

我注意到我今天想解释的东西很奇怪。 我不是100%不确定如何将其表达为一个问题,所以google完全没有问题。 由于某些奇怪的原因,日志记录模块无法访问模块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'>

谁能解释为什么会这样?

在Python中,需要先导入模块,然后才能对其进行访问。 import loggingimport logging记录模块。 碰巧logging是带有子模块的软件包,但是那些子模块仍然不会自动加载。 因此,您需要先显式导入logging.handlers才能访问它。

如果您想知道为什么有时看起来不需要多余的导入:某些软件包在导入时会导入其子模块的某些或全部-只需在__init__.py文件中进行这些导入即可。 在其他情况下,可能是您导入了其他内容,也导入了logging.handlers 导入哪段代码都没有关系。 只要您进程中的某些内容在您访问它之前就将logging.handlers导入,它就会在那里。 有时看起来像软件包的模块实际上不是一个模块,例如osos.path os不是软件包,它只是导入正确的其他模块(适用于您的平台)并称为path ,因此您可以以os.path身份对其进行访问。

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

如果您想让您的任何文件夹成为python软件包-它必须包含__init__.py文件,即使是空文件也可以!

如Thomas所说,如果需要,您可以在__init__.p y中导入额外的模块! 但是模块/软件包只有在导入后才能访问...

如果要从模块导入所有内容,可以使用

from logging import *

其余的您也可以像下面一样访问处理程序模块,

from logging import handlers
print dir(handlers)

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

为什么会出现错误:' AttributeError: module'module_name '没有属性' sub_module_name ',即使我的编辑器(例如Visual Code)自动完成了子模块的名称,也是如此:

 import module_name
 module_name.sub_module_name(parameter)

回答

编辑器的自动完成是基于项目的文件结构,而不是基于Python行为。 导入模块时,不会“自动”导入子模块。 参考Python文档以获取有关在使用时如何“自动”导入子模块的详细信息

 import module_name

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

希望这对某人有帮助!

我最近面临着同样的奇怪情况。 因此,我敢打赌您已经删除了一些第三方lib导入。 这样就from logging import handlersfrom logging import *删除了lib from logging import handlers并为您提供了handlers 在其他脚本中,您有诸如import logging类的东西,并且仅使用了logging.handlers ,您认为这是我工作的一种方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM