Python 动态导入和日志记录:找不到记录器的处理程序

Python 动态导入和日志记录:找不到记录器的处理程序,python,python-2.7,Python,Python 2.7,我正在通过映射(\uuu import\uuu,'scripts.myscript')动态加载python模块。我正在父模块中配置记录器,并且在父模块中登录工作正常。但是,动态加载模块中的任何日志记录都会向stderr返回以下消息: No handlers could be found for logger 我唯一的解决方法是将动态加载模块的logger属性设置为父模块的logger属性;e、 g: logger = logging.getLogger(__name_) # ... confi

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

No handlers could be found for logger
我唯一的解决方法是将动态加载模块的
logger
属性设置为父模块的
logger
属性;e、 g:

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)
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
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)
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