我想知道今天我想解释一些奇怪的东西。我不是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'>
有人可以解释为什么会这样吗?
答案 0 :(得分:93)
在Python中,模块需要在可访问之前导入。 import logging
仅导入日志记录模块。碰巧logging
是一个包含子模块的包,但这些子模块仍然没有自动加载。因此,您需要先显式导入logging.handlers
,然后才能访问它。
如果你想知道为什么它看起来有时你不需要那些额外的导入:一些包在导入时导入它们的部分或全部子模块 - 只需在它们的__init__.py
文件中进行这些导入。在其他情况下,可能是您导入的其他内容,也导入了logging.handlers
。导入哪一段代码无关紧要;只要您的流程中的某些在您访问之前导入logging.handlers
,它就会存在。有时,看起来像包的模块不是一个,如os
和os.path
。 os
不是软件包,只是导入正确的其他模块(针对您的平台)并将其称为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 handlers
或from 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
希望这对某人有帮助!