使用长数据进行日志记录的子流程中的子流程失败

时间:2019-01-04 04:22:37

标签: python-2.7 logging subprocess pipe popen

我正在运行一个Python进程“ a”(gui),该进程调用第二个Python子进程“ b”,而该子进程又调用另一个子进程“ c”(一个exe文件)。进程c的输出通过管道传送到b,该b包含日志功能。 c的输出包含一些很长的行(+ 37K字符),并且在将输出发送到日志记录功能时程序b挂起。它进入了一个黑洞-进入记录器功能,然后退出。

直接从命令行运行代码可以正常工作,并将输出发送到print()或sys.stdout.write()可以正常工作。记录较短的行很好。

如下处理呼叫过程b:

p = subprocess.Popen(cur_cmd2, stdout=subprocess.PIPE,
    stderr=subprocess.PIPE, bufsize=0, creationflags=0x08000000)

进程b然后按如下所示调用进程c:

p = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in p.stdout:        
    logger.info(line.rstrip('\n'))

失败发生在最后一行(logger.info())。 请注意,以下行位于声明部分:

logger = logging.getLogger(__name__)

我猜有一个缓冲区问题。我也在猜测,由于程序似乎停止了(调试暂停不会中断代码-似乎没有python代码正在运行),它很可能试图输出错误消息,但是输出正在重定向并且它永远不会进入控制台或日志文件。我所有的猜测都无法帮助我理解如何使它正常工作。请告知。

0 个答案:

没有答案