1. ホーム
  2. python

AttributeError: 'module' object has no attribute 'handlers'--Python submodule import problem

2022-02-21 19:05:45
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' オブジェクトには 'handlers' という属性がありません。
logging モジュールをインポートした後、そのサブモジュールハンドラを自動的にインポートしていないことが判明しました。
import logging
import logging.handlers
......


再実行すると、プログラムが正常に出力されます。
Pythonプログラムのモジュールは、アクセスする前にインポートする必要があります。import loggingはloggingモジュールだけをインポートしますが、これは自動的にロードされないサブモジュールを持つパッケージです。ですから、logging.handlersサブモジュールにアクセスする前に明示的にインポートする必要があります。
しかし、時々、いくつかのパッケージは、自動的にそのサブモジュールをインポートするための追加のアクションなしでインポートされます。それらのアクションはパッケージの __init__.py ファイルで行われるからです。他のケースでは、あなたがインポートする他の何かが logging.handlers モジュールをインポートすることもあります。どのような場合であっても、ただ、事前にアクセスすることを確認してください。
対応するサブモジュールはすでにインポートされています。os はパッケージではなく、単に path と呼ばれる他のモジュールを提供し、あなたは os.path を通してそれにアクセスすることができます。