unutbu
的评论很好;你应该看看Lennart 的回答。
您需要的是类似 的功能tee
,但该subprocess
模块在操作系统句柄级别工作,这意味着您的 Python 代码无法看到由子进程写入的数据,例如您编写的一些类似文件的对象,哪些日志并打印写入其中的任何内容。
除了使用 Lennart 的答案外,您还可以使用第三方库(如sarge
(披露:我是它的维护者)来做这种事情。它不仅适用于日志记录。假设您有一个生成输出的程序,例如:
# echotest.py
import time
for i in range(10):
print('Message %d' % (i + 1))
并且您想在脚本中捕获它,将其记录下来并将其打印到屏幕上:
#subptest.py
from sarge import capture_stdout
import logging
import sys
logging.basicConfig(filename='subptest.log', filemode='w',
level=logging.INFO)
p = capture_stdout('python echotest.py', async=True)
while True:
line = p.stdout.readline()
line = line.strip()
# depending on how the child process generates output,
# sometimes you won't see anything for a bit. Hence only print and log
# if you get something
if line:
print(line)
logging.info(line)
# Check to see when we can stop - after the child is done.
# The return code will be set to the value of the child's exit code,
# so it won't be None any more.
rc = p.commands[0].process.poll()
# if no more output and subprocess is done, break
if not line and rc is not None:
break
如果你运行上面的脚本,你会被打印到控制台:
$ python subptest.py
Message 1
Message 2
Message 3
Message 4
Message 5
Message 6
Message 7
Message 8
Message 9
Message 10
当我们检查日志文件时,我们看到:
$ cat subptest.log
INFO:root:Message 1
INFO:root:Message 2
INFO:root:Message 3
INFO:root:Message 4
INFO:root:Message 5
INFO:root:Message 6
INFO:root:Message 7
INFO:root:Message 8
INFO:root:Message 9
INFO:root:Message 10