动态导入和日志:找不到logg的处理程序

2024-04-26 04:00:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在通过map(__import__, 'scripts.myscript')trick动态加载python模块。我在父模块中配置记录器,并且在父模块中进行日志记录工作正常。但是,动态加载模块中的任何日志记录都会向stderr返回以下消息:

No handlers could be found for logger

我唯一的解决方法是将动态加载的模块的logger属性设置为父模块的logger属性;例如:

logger = logging.getLogger(__name_)
# ... configure logger
script = map(__import__, 'scripts.myscript')[0]
script.myscript.logger = logger

有没有更好的方法让动态加载的模块接受父模块中记录器的设置?你知道吗

顺便说一句,为什么在动态导入这样的模块时不发生正常的记录器传播?你知道吗


我的项目结构:

/app
    /app
        config.py
        ...
    /scripts
        myscript.py
        ...
    script.py

script.py中,我动态加载myscript.py,如下所示:

import logging
import sys

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)


# get 'myscript' from args
script_name = sys.argv[1]
script = map(__import__, ['scripts.{}'.format(script_name)])[0]

# The workaround is to set the dynamic module's logger attribute
# to the parent module's attribute, like this:
# getattr(script, script_name).logger = logger

# call main() function in myscript.py
errno = getattr(script, script_name).main()

# This is logged successfully
logger.info("Errno from {} is {}".format(script_name, errno)

myscript.py与以下内容类似:

from app.config import * # See note below
import logging
logger = logging.getLogger(__name__)

def main():
    # This results in: No handlers could be found for logger
    logger.info("Hello world")
    return 0

如果有人想知道为什么我要经历所有这些麻烦,首先是因为上面的项目结构。我希望scripts目录与app目录处于同一级别,但我希望单个脚本可以访问app/config.py模块。我不想修改单个脚本中的python/sys路径,也不想将应用程序安装到站点包中。我还喜欢所有脚本都有一个入口点script.py。你知道吗


Tags: 模块namepyimportconfigappmaplogging