【发布时间】:2018-10-20 22:57:59
【问题描述】:
我正在将标准输出重定向到记录器,现在我使用 multiprocessing.Process 生成了一个进程。然而,即使进程标准输出被重定向到父标准输出,它也会忽略 sys.stdout 覆盖。这是一个例子:
import multiprocessing
import sys
import logging
def worker():
print('Hello from the multiprocessing')
sys.stdout.flush()
class LoggerWriter:
def __init__(self, logger, level):
self.logger = logger
self.level = level
def write(self, message):
if message != '\n':
self.logger.log(self.level, "LOGGER: "+message)
def flush(self):
pass
if __name__ == '__main__':
logging.basicConfig(level=logging.INFO, format='%(message)s')
sys.stdout = LoggerWriter(logging.getLogger(), logging.INFO)
p = multiprocessing.Process(target=worker)
print("Hello from main")
p.start()
p.join()
我希望它会打印出来
LOGGER: Hello from main
LOGGER: Hello from the multiprocessing
但是我得到了
LOGGER: Hello from main
Hello from the multiprocessing
它完全忽略了 sys.stdout ...这是为什么呢?第一种情况能实现吗?
注意:这是在 Windows 7 上 - 似乎它可能会起作用。
【问题讨论】:
-
您需要在每个进程中覆盖
sys.stdout。检查this answer 作为在多处理设置中捕获 STDOUT/STDERR 的示例。 -
因为你构造了一个new进程,也就是说它有自己的stdin、stdout等
-
实际上,以上内容适用于我的 python3.7(尽管有一个额外的尾随空日志行)。这是 windows vs linux 的事情吗?
-
@AndrasDeak - 这是一个分叉与实际的新进程的东西。它可能发生在支持 fork 的系统上(并非所有多处理都可以通过 fork 实现),但在 Windows 上总是如此,因为它甚至不支持 fork。
-
@zwer 谢谢,会查的。