2013-07-25 163 views
4

我有一個長的Python腳本,經常使用打印語句,我想知道是否有可能添加一些代碼,將所有的打印語句記錄到文本文件或類似的東西。當用戶在整個程序中收到提示時,我仍然希望所有的打印語句都進入命令行。如果可能的話,記錄用戶的輸入也是有益的。Python,記錄打印語句,同時讓他們打印到標準輸出

我發現這裏面有些回答我的問題,但使得它在「打印」語句不再打印到命令行

Redirect Python 'print' output to Logger

+1

是的,這是可能的。這真的是你的問題嗎? –

+0

@Robᵩ[哈哈哈](http://www.troll.me/images/brick-tamland/you-think-youre-funny-but-youre-not.jpg) – Stephan

+1

@Stephan - 我不認爲我很搞笑。我試圖瞭解OP實際上想要從我們那裏得到什麼。 –

回答

8

您可以添加到您的腳本:

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

很確定那不是他想要的...... –

7

這是一個程序,它可以描述你所做的:

#! /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") 
+0

你爲什麼要用一個類,爲什麼他們都叫'Tee'? – Stephan

+1

我使用了一個類,因爲'print'最終會調用'sys.stdout.write()'。由於我正在更換'sys.stdout',我的替換文件需要'.write()'。我在[unix'tee'程序](http://linux.die.net/man/1/tee)之後將它稱爲'Tee',它本身是以[同名的管道夾具]命名的(http: //en.wikipedia.org/wiki/Plumbing_fittings#Tee)。 –

+1

neato,謝謝,可能想在回答 – Stephan

2

如果你使用內置的logging module您可以根據需要爲您的記錄器配置儘可能多的輸出:將文件,數據庫,電子郵件等存檔。然而,您聽起來像是混合了兩種不同用途的打印:記錄(記錄程序流以備後續檢查)和提示。真正的工作是將「打印」的這兩種用途分解爲不同的功能,以便在每個地方獲得所需的內容。

許多人replace python's generic sys.stdout and sys.stderr自動將東西發送到正在發送到控制檯的文本。真正的控制檯輸出總是存在於sys.__stdout__sys.__stderr__(所以你不必擔心它會'丟失'),但是如果你使用與文件相同的方法將任何對象粘貼到變量sys.stdoutsys.stderr中,你可以做任何事情與輸出過程一樣。

-1

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) 
+1

爲什麼諷刺? – jononomo