首页 > 代码库 > AttributeError: 'module' object has no attribute 'handlers'--Python子模块导入问题

AttributeError: 'module' object has no attribute 'handlers'--Python子模块导入问题

想使用python的logging模块记录日志,并使用RotatingFileHandler来处理日志以便于在日志文件超过指定的大小后会重新生成新的日志文件。

基本代码如下:
import logging

logger = logging.getLogger(‘mylogger‘)
logger.setLevel(logging.INFO)

fh=logging.handlers.RotatingFileHandler(‘/tmp/test.log‘, mode = ‘a‘, maxBytes=10240, backupCount=3, encoding=‘utf-8‘)

formatter = logging.Formatter(‘%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s‘)
fh.setFormatter(formatter)

logger.addHandler(fh)

logger.info(‘hello logging‘)
logger.warning(‘hello logging‘)
logger.error(‘hello logging‘)
logger.critical(‘hello logging‘)

运行时报错:
AttributeError: ‘module‘ object has no attribute ‘handlers‘

原来导入logging模块后并没有自动导入其子模块handlers
import logging
import logging.handlers
……
重新运行,程序正常输出。

Python程序中模块在被访问前必须导入,import logging仅导入了logging模块,而logging是一个拥有子模块的包,这些子模块没有被自动载入。所以在访问签需要明确的导入logging.handlers子模块。

但有时候,在导入一些包时并不需要额外的动作就能自动导入其子模块,这是因为在包的__init__.py文件中进行了这些操作。在另外一些情况下,你导入的另外一些东西也可能会导入logging.handlers模块。无论如何,只要保证访问前

对应的子模块已经导入便可。某些时候一个模块看起来是个包实际上并不是,比如os和os.path。os并非包,它只是提供了其他的模块叫path,你可以通过os.path来访问。