Python模块使用__main__.py运行时,子进程日志无法继承父进程配置的问题求助
Python模块使用__main__.py运行时,子进程日志无法继承父进程配置的问题求助
我遇到了一个关于Python多进程日志的奇怪问题,先给大家看看我的最小复现环境:
目录结构
/mymodule ├── __init__.py ├── main.py └── worker.py
其中__init__.py是空文件。
main.py代码
import sys import logging import multiprocessing from test.worker import do_stuff logging.basicConfig( format='[%(name)s] [%(levelname)s]: %(message)s', level=logging.DEBUG, ) logger = logging.getLogger(__name__) def main(): logger.debug('I am main. I manage workers') logger.info('I am main. I manage workers') logger.warning('I am main. I manage workers') p = multiprocessing.Process(target=do_stuff) p.start() if __name__ == '__main__': sys.exit( main() )
worker.py代码
import logging logger = logging.getLogger(__name__) def do_stuff(): logger.debug(f'I am a worker. I do stuff') logger.info(f'I am a worker. I do stuff') logger.error(f'I am a worker. I do stuff') logger.error(f'Here is my logger: {logger}')
正常运行的情况
当我执行python -m mymodule.main时,输出完全符合预期:
[__main__] [DEBUG]: I am main. I manage workers [__main__] [INFO]: I am main. I manage workers [__main__] [WARNING]: I am main. I manage workers [mymodule.worker] [DEBUG]: I am a worker. I do stuff [mymodule.worker] [INFO]: I am a worker. I do stuff [mymodule.worker] [ERROR]: I am a worker. I do stuff [mymodule.worker] [ERROR]: Here is my logger: <Logger mymodule.worker (DEBUG)>
出现问题的情况
但我只是把/mymodule/main.py重命名为mymodule/__main__.py,然后执行python -m mymodule.__main__或者python -m mymodule时,输出就不对了:
[__main__] [DEBUG]: I am main. I manage workers [__main__] [INFO]: I am main. I manage workers [__main__] [WARNING]: I am main. I manage workers I am a worker. I do stuff Here is my logger: <Logger mymodule.worker (WARNING)>
很明显,第二种情况下mymodule.worker的logger没有继承logging.basicConfig的配置,不仅日志格式丢失了,日志级别还变成了WARNING。我完全没改代码,只是改了文件名而已,这是为什么呢?
我希望能通过__main__.py实现直接用模块名运行的便捷性,同时还能让logging.basicConfig的配置正确被子模块和子进程继承,该怎么解决这个问题呢?
备注:内容来源于stack exchange,提问作者Art Gertner
相关产品推荐
相关产品推荐

