[英]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 logging
仅import logging
记录模块。 碰巧logging
是带有子模块的软件包,但是那些子模块仍然不会自动加载。 因此,您需要先显式导入logging.handlers
才能访问它。
如果您想知道为什么有时看起来不需要多余的导入:某些软件包在导入时会导入其子模块的某些或全部-只需在__init__.py
文件中进行这些导入即可。 在其他情况下,可能是您导入了其他内容,也导入了logging.handlers
。 导入哪段代码都没有关系。 只要您进程中的某些内容在您访问它之前就将logging.handlers
导入,它就会在那里。 有时看起来像软件包的模块实际上不是一个模块,例如os
和os.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 handlers
或from logging import *
删除了lib from logging import handlers
并为您提供了handlers
。 在其他脚本中,您有诸如import logging
类的东西,并且仅使用了logging.handlers
,您认为这是我工作的一种方式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.