97

我今天注意到一些奇怪的事情,我想解释一下。我不是 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

4 回答 4

127

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

如果您想知道为什么有时您不需要这些额外的导入:某些包在导入时会导入部分或全部子模块——只需在__init__.py文件中进行这些导入即可。在其他情况下,可能是您导入的其他内容,也可能是 import logging.handlers。导入哪一段代码并不重要;只要您的流程中的某些内容在您访问之前导入logging.handlers,它就会在那里。有时看起来像包的模块实际上不是一个,比如osand os.pathos不是一个包,它只是导入正确的其他模块(适用于您的平台)并调用它path,这样您就可以将它作为os.path.

于 2010-09-23T18:49:54.867 回答
4

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

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

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

如果你想从一个模块中导入所有东西,你可以使用

from logging import *

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

from logging import handlers
print dir(handlers)

于 2010-09-23T19:00:29.830 回答
3

Thomas Wouters很好地回答了这个问题,但是很可惜,我是在原始文档中找到答案后才发现这个问题的。为此,我想我会添加它,希望它在未来弹出更接近搜索引擎的顶部。

问题

为什么即使我的编辑器(例如 Visual Code)自动完成子模块名称,也会出现错误:' AttributeError: module ' module_name ' has no attribute ' sub_module_name ':

 import module_name
 module_name.sub_module_name(parameter)

回答

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

 import module_name

这个答案的关键贡献是在尝试导入“模块”或“包”时添加 AttributeError

希望这对某人有帮助!

于 2019-07-06T14:49:10.677 回答
1

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

于 2016-10-19T09:54:11.787 回答