2016-09-22 107 views
1

我有不同的功能,這是在功能執行期間在終端中給出字符串和文本輸出。我使用的命令是sys.stdout.write寫終端輸出到終端和文件?

在函數的其中一個函數中,我創建一個文件並調用上面提到的那些函數。運行此功能時,我需要將文件中不同功能的所有sys.output.write輸出以及終端寫入。

示例代碼是這樣的:

def func1(): 
    sys.stdout.write('A') 
    sys.stdout.write('B') 

def func2(): 
    sys.stdout.write('C') 
    sys.stdout.write('D') 
def main(): 
    fileName=open("log.txt","W+") 
    func1() 
    func2() 
    -------------------- 
    # need output ABCD both in terminal and write in logfile as well 
    # unfortunately cannot change anything in func1() and func2() 
+0

爲什麼你不允許改變這些方法?另外,當然你必須嘗試一些東西來看看你如何寫一個你需要的文件?你可以展示更多的代碼嗎? – idjaw

+0

需要很多的代碼中的變化,我需要改變func1和func2 :-( – mortuzahasan

+0

什麼是目前發生在你的代碼不符合您的期望? – idjaw

回答

1

使用上下文管理器創建寫入文件和stdout包裝:

class Tee(object): 
    def __init__(self, log_file_name, stdout): 
     self.log_file_name = log_file_name 
     self.stdout = stdout 

    def __enter__(self): 
     self.log_file = open(self.log_file_name, 'a', 0) 
     return self 

    def __exit__(self, exc_type, exc_value, exc_traceback): 
     self.log_file.close() 

    def write(self, data): 
     self.log_file.write(data) 
     self.stdout.write(data) 
     self.stdout.flush() 

def main(): 
    with Tee('log.txt', sys.stdout) as sys.stdout: 
     func1() 
     func2() 

別忘後刷新stdout每個緩衝寫入。

+0

爲什麼要使用sys.stdout作爲別名? – jmugz3

+0

@ jmugz3:所以'func1'和'func2'中的代碼不必改變。 –

1
import sys 
def func1(): 
    sys.stdout.write('A') 
    sys.stdout.write('B') 

def func2(): 
    sys.stdout.write('C') 
    sys.stdout.write('D') 



class MyCoolOs: 
    def __init__(self,stdout,f): 
    self.stdout = stdout 
    self.f = f 

    def write(self,s): 
    self.f.write(s) 
    self.stdout.write(s) 


def main(): 
    f=open("log.txt","a") 
    sys.stdout = MyCoolOs(sys.stdout,f) 
    func1() 
    func2() 

main() 
+0

謝謝明,你的解決方案是隻寫在文件中,不寫在終端,我期待輸出在終端和文件 – mortuzahasan

+0

更新。對不起沒有仔細閱讀規格 – Ming