簡體   English   中英

Python記錄器無法與子過程一起使用

[英]Python logger not working with subproccess

我試圖通過使用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和隨后的所有logger調用打印到終端,那么我將如何實現呢?

我相信您搞亂了記錄器的設置。 還有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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM