2016-02-11 82 views
0

我正在写一个将在容器中运行的python程序,我正在与此容器共享一个目录以保存所有日志。但我无法重定向输出。有没有办法在一个文件中记录所有的python stdout和stder?

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

Python 2.7

+0

你想重定向什么?你能修改代码吗?你究竟想达到什么目的?发布[MCVE](http://stackoverflow.com/help/mcve) –

+0

您可以用任何类似文件的对象替换'sys.stdout'和'sys.stderr'。你也可以用'os.dup2()'文件描述符1和2来进行“更强”的重定向。 –

+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

或者只是'print >> f,“Hello”'而不是改变'sys.stdout'。 –

+0

@VincentSavard我打算提出这个建议,但认为OP有一堆打印声明,他们不想在整个地方进行更改。 – sberry

+0

这是可能的,但在这种情况下,我可能会建议在他的外壳的帮助下重定向输出。 'python foo.py> log.txt'。这个问题可以从更多的信息中受益。 –

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 
+0

#platinhom我试过了,但它在执行后立即写入所有输出,并且我想跟踪登录苍蝇。 –

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' 
相关问题