我正在编写一个将在容器中运行的python程序,我正在与此容器共享一个目录以保存所有日志。但我无法重定向输出。
python代码中是否有办法将所有输出重定向到文件?
Python 2.7
答案 0 :(得分:1)
如果这仅适用于某些开发测试,那么这应该可行。
>>> import sys
>>> f = open("/tmp/stdout", "w")
>>> sys.stdout = f
>>> print "Hello"
>>> print "Whoa"
> cat /tmp/stdout
Hello
Whoa
您可能需要定期致电sys.stdout.flush()
以获得更多实时输出。
您也可以使用这样的包装(从Disable output buffering中窃取):
class Unbuffered(object):
def __init__(self, stream):
self.stream = stream
def write(self, data):
self.stream.write(data)
self.stream.flush()
def __getattr__(self, attr):
return getattr(self.stream, attr)
然后你会做
sys.stdout = Unbuffered(open("/tmp/stdout", "w"))
print "foo"
print "bar"
如果你需要sys.stdout,你应该能够做到
sys.stdout = sys.__stdout__
答案 1 :(得分:1)
您可以为sys.stdout
和sys.stderr
提供文件句柄,以将输出或错误重定向到文件。
例如:
stdo=sys.stdout
# need a file handle with write mode
fhandle=open("out.txt",'w');
sys.stdout=fhandle
print "I'm the output~"
......
# reset the standard output
sys.stdout=stdo
答案 2 :(得分:0)
如果你想要同时做到这两件事
class OutputLogger(object):
def __init__(self, output_file='/tmp/output_file.txt'):
self.std = sys.stdout
self.outfile = open(output_file, 'w')
def write(self, message):
self.std.write(message)
self.outfile.write(message)
def flush(self):
self.outfile.flush()
self.std.flush()
并像
一样使用它import sys
sys.stdout = OutputLogger(path_to_file)
print 'Hello Logger'