有没有办法在文件中记录所有python stdout和stder?

时间:2016-02-11 18:40:00

标签: python

我正在编写一个将在容器中运行的python程序,我正在与此容器共享一个目录以保存所有日志。但我无法重定向输出。

python代码中是否有办法将所有输出重定向到文件?

Python 2.7

3 个答案:

答案 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.stdoutsys.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'