我正在寫一個將在容器中運行的python程序,我正在與此容器共享一個目錄以保存所有日誌。但我無法重定向輸出。有沒有辦法在一個文件中記錄所有的python stdout和stder?
python代碼中有沒有辦法將所有輸出重定向到文件?
Python 2.7
我正在寫一個將在容器中運行的python程序,我正在與此容器共享一個目錄以保存所有日誌。但我無法重定向輸出。有沒有辦法在一個文件中記錄所有的python stdout和stder?
python代碼中有沒有辦法將所有輸出重定向到文件?
Python 2.7
如果這僅僅是一些開發測試,這應該工作正常。
>>> 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__
或者只是'print >> f,「Hello」'而不是改變'sys.stdout'。 –
@VincentSavard我打算提出這個建議,但認爲OP有一堆打印聲明,他們不想在整個地方進行更改。 – sberry
這是可能的,但在這種情況下,我可能會建議在他的外殼的幫助下重定向輸出。 'python foo.py> log.txt'。這個問題可以從更多的信息中受益。 –
你可以給文件句柄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
#platinhom我試過了,但它在執行後立即寫入所有輸出,並且我想跟蹤登錄蒼蠅。 –
如果你同時想同時你可以做到這一點
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'
你想重定向什麼?你能修改代碼嗎?你究竟想達到什麼目的?發佈[MCVE](http://stackoverflow.com/help/mcve) –
您可以用任何類似文件的對象替換'sys.stdout'和'sys.stderr'。你也可以用'os.dup2()'文件描述符1和2來進行「更強」的重定向。 –
這只是爲了發展。 –