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

我注意到今天我想解释一些奇怪的东西。 我并不十分确定如何将此作为一个问题,所以谷歌是不可能的。 由于某种奇怪的原因,日志logging模块无法访问模块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.pathos不是一个包,它只是导入正确的其他模块(为您的平台),并调用它的path ,只要你可以访问它作为os.path

我也是新来的python,现在有很多的做法后,我可以区分,包(文件夹),模块(.py),类,variables等… …

如果你想要你的任何文件夹是python包 – 它必须包含__init__.py文件甚至空文件将做!

正如Thomas所说,你可以在__init__.p导入额外的模块__init__.p 但是模块/软件包只有在导入后才可以访问…

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

 from logging import * 

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

 from loggin import handlers print dir(handlers) 

我最近面临同样的奇怪的情况。 所以,我敢打赌,你已经删除了一些第三方库导入。 这删除了from logging import handlersfrom logging import *并为您提供handlers 。 而在其他脚本中,你已经有了类似于import logging ,只是使用了logging.handlers而且你认为这是一种与我一样的工作方式。