subprocess.call记录器信息和stdout和stderr的错误

Doo*_*Dah 6 python logging

我有一个记录器.这样的事情:

import logging

logger = logging.getLogger('myApp')
hdlr = logging.FileHandler('myApp.log')
logger.addHandler(hdlr)
logger.setLevel(logging.INFO)
Run Code Online (Sandbox Code Playgroud)

我正在调用这样的外部进程:

subprocess.call("someCommand")
Run Code Online (Sandbox Code Playgroud)

我想从该过程中单独捕获stdout和stderr,以便我可以相应地记录它们.例如

logger.info(<stdout>)
logger.error(<stderr>)
Run Code Online (Sandbox Code Playgroud)

我看到了在一个流中捕获所有子进程的各种方法.但是,如果存在实际错误,我想将其记录下来.有没有办法做到这一点?

Mar*_*ers 19

使用subprocess.Popen()并调用.communicate()返回的流程对象:

p = subprocess.Popen(["someCommand"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()

if stdout:
    logger.info(stdout)
if stderr:
    logger.error(stderr)
Run Code Online (Sandbox Code Playgroud)

  • 当stdout或stderr有大量数据时会出现这种情况,因为`.communicate()`会缓冲数据.有些人可能希望在任一管道中有一条线路时立即调用`logger`. (3认同)