【问题标题】:Can I redirect my print statements to multiple outputs without modifying my whole code?我可以在不修改整个代码的情况下将我的打印语句重定向到多个输出吗?
【发布时间】:2019-02-18 19:19:56
【问题描述】:
我知道我可以将打印语句重定向到文件:
导入系统
sys.stdout = open("log.txt", "w")
但同时我需要打印到我的终端。这个想法是为每次打印编写打印语句。有没有更好的方法来解决这个问题?
【问题讨论】:
-
你考虑过使用logging吗?一开始可能看起来比简单地使用print 更复杂,并且对于非常小、简单的脚本来说可能有点矫枉过正,但它支持多个目标(即处理程序)。
标签:
python
python-2.7
printing
sys
【解决方案1】:
您可以使用这个答案:How to redirect python subprocess stderr and stdout to multiple files?
基本思想是创建一个多输出文件类型对象,并将其分配给sys.stdout。
import sys
class MultiOut(object):
def __init__(self, *args):
self.handles = args
def write(self, s):
for f in self.handles:
f.write(s)
with open('q1', 'w') as f1, open('q2', 'w') as f2, open('q3', 'w') as f3:
# add all the files (including sys.stdout) to which the output should be written
sys.stdout = MultiOut(f1, f2, sys.stdout)
for i, c in enumerate('abcde'):
print(c, 'out')
print(i, 'err')
【解决方案2】:
是的,您可以将代码重定向到任意数量的文件以及同时重定向到 CLI。需要引入一个新类来覆盖现有的 write 方法。
试试下面的 sn-p,它对我有用:
import sys
class MultiPrinter(object):
def __init__(self, *targets):
self.targets = targets
def write(self, obj):
for f in self.targets:
f.write(obj)
f.flush()
f = open('logs.txt', 'w')
f1 = open('logs1.txt', 'w')
f2 = open('logs2.txt', 'w')
sys_org = sys.stdout
sys.stdout = MultiPrinter(sys_org, f, f1, f2)
print('First Statement.....')
print('Another Statement....')