我有一個長的Python腳本,經常使用打印語句,我想知道是否有可能添加一些代碼,將所有的打印語句記錄到文本文件或類似的東西。當用戶在整個程序中收到提示時,我仍然希望所有的打印語句都進入命令行。如果可能的話,記錄用戶的輸入也是有益的。Python,記錄打印語句,同時讓他們打印到標準輸出
我發現這裏面有些回答我的問題,但使得它在「打印」語句不再打印到命令行
Redirect Python 'print' output to Logger
我有一個長的Python腳本,經常使用打印語句,我想知道是否有可能添加一些代碼,將所有的打印語句記錄到文本文件或類似的東西。當用戶在整個程序中收到提示時,我仍然希望所有的打印語句都進入命令行。如果可能的話,記錄用戶的輸入也是有益的。Python,記錄打印語句,同時讓他們打印到標準輸出
我發現這裏面有些回答我的問題,但使得它在「打印」語句不再打印到命令行
Redirect Python 'print' output to Logger
您可以添加到您的腳本:
import sys
sys.stdout = open('logfile', 'w')
這將使打印語句寫入logfile
。
如果你想打印到stdout
和文件的選項,你可以試試這個:
class Tee(object):
def __init__(self, *files):
self.files = files
def write(self, obj):
for f in self.files:
f.write(obj)
f = open('logfile', 'w')
backup = sys.stdout
sys.stdout = Tee(sys.stdout, f)
print "hello world" # this should appear in stdout and in file
要恢復到剛打印到控制檯上,只恢復了「備份」
sys.stdout = backup
很確定那不是他想要的...... –
這是一個程序,它可以描述你所做的:
#! /usr/bin/python3
class Tee:
def write(self, *args, **kwargs):
self.out1.write(*args, **kwargs)
self.out2.write(*args, **kwargs)
def __init__(self, out1, out2):
self.out1 = out1
self.out2 = out2
import sys
sys.stdout = Tee(open("/tmp/log.txt", "w"), sys.stdout)
print("hello")
如果你使用內置的logging module您可以根據需要爲您的記錄器配置儘可能多的輸出:將文件,數據庫,電子郵件等存檔。然而,您聽起來像是混合了兩種不同用途的打印:記錄(記錄程序流以備後續檢查)和提示。真正的工作是將「打印」的這兩種用途分解爲不同的功能,以便在每個地方獲得所需的內容。
許多人replace python's generic sys.stdout and sys.stderr自動將東西發送到正在發送到控制檯的文本。真正的控制檯輸出總是存在於sys.__stdout__
和sys.__stderr__
(所以你不必擔心它會'丟失'),但是如果你使用與文件相同的方法將任何對象粘貼到變量sys.stdout
和sys.stderr
中,你可以做任何事情與輸出過程一樣。
hm ...難以實現自己的print()函數和裝飾器,它會記錄傳遞給打印函數的任何東西嗎?
def logger(func):
def inner(*args, **kwargs):
log(*args, **kwargs) # your logging logic
return func(*args, **kwargs)
return inner
@logger
def lprint(string_to_print):
print(string_to_print)
爲什麼諷刺? – jononomo
是的,這是可能的。這真的是你的問題嗎? –
@Robᵩ[哈哈哈](http://www.troll.me/images/brick-tamland/you-think-youre-funny-but-youre-not.jpg) – Stephan
@Stephan - 我不認爲我很搞笑。我試圖瞭解OP實際上想要從我們那裏得到什麼。 –