【问题标题】:Python logger not working with subproccessPython 记录器不适用于子进程
【发布时间】:2019-04-17 12:39:57
【问题描述】:

我正在尝试通过使用 subproccess.popen 调用从一个程序 (program1) 运行代码。程序 2(被调用的程序)不显示记录器语句。在下面的示例代码中,program1 调用 program2 并为每个代码设置日志记录。

program1.py

import subprocess
import logging
import sys

def configure_logging(name):
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter("%(asctime)s:%(name)s:%(message)s")
    stream_handler = logging.StreamHandler()
    stream_handler.setFormatter(formatter)
    logger.addHandler(stream_handler)
    return logger

logger = configure_logging(__name__) 
python_path = "Path/to/specific/pythonexe"
py_path = "Path/to/program2.py"    
cmd = "{} {}".format(python_path,py_path) 
logger.info("Cmd: {}".format(cmd)) 
cmd = cmd.split()        
proc = subprocess.Popen(cmd,stdout=subprocess.PIPE,stderr=subprocess.PIPE,universal_newlines=True)

program2.py

import logging
def logstuff(name):
    logger = logging.getLogger(name)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter("%(asctime)s:%(name)s:%(message)s")
    stream_handler = logging.StreamHandler()
    stream_handler.setFormatter(formatter)
    logger.addHandler(stream_handler)
    return logger

def main():
    logger.info("hi")
    print("hi2")

if __name__ == "__main__": 
    logger = logstuff(__name__)
    main()

使用上面的设置program1调用program2但是logger.info语句没有打印出来只有print()语句是。

我无法导入 program2,因为它依赖于封装在 anaconda 环境中的特定 python 版本。

我想要的输出是将 logger.info 和任何后续记录器调用打印到终端,那么我将如何实现这一点?

【问题讨论】:

    标签: python logging


    【解决方案1】:

    我相信您搞砸了记录器设置。带有 stdout PIPE 的 subprocess.Popen 也对我不起作用。这是我在本地工作的内容,希望对您有所帮助。

    program1.py

    import logging
    import subprocess
    
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s:%(name)s:%(message)s')
    stream_handler = logging.StreamHandler()
    stream_handler.setFormatter(formatter)
    logger.addHandler(stream_handler)
    
    python_path = 'python'
    py_path = 'program2.py'
    cmd = '{} {}'.format(python_path, py_path)
    logger.info('Cmd: {}'.format(cmd))
    cmd = cmd.split()
    subprocess.call(cmd)
    

    program2.py

    import logging
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG)
    formatter = logging.Formatter('%(asctime)s:%(name)s:%(message)s')
    stream_handler = logging.StreamHandler()
    stream_handler.setFormatter(formatter)
    logger.addHandler(stream_handler)
    
    
    def main():
        logger.info('hi program2 here')
    
    if __name__ == '__main__':
        main()
    

    输出:

    $ python program1.py 
    2018-11-14 15:38:53,905:__main__:Cmd: python program2.py
    2018-11-14 15:38:53,917:__main__:hi program2 here
    

    【讨论】:

      猜你喜欢
      • 2018-09-01
      • 2023-02-21
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 1970-01-01
      • 2016-07-02
      相关资源
      最近更新 更多