2017-01-05 61 views
1

我想在Python中以下內容。自定義標準輸出和標準輸入寫入和讀取數據在同一模塊 - Python

方法1將輸出寫入方法2讀取的自定義標準輸出(StringIO)。該代碼是這樣

import sys 
from StringIO import StringIO 

stringIOObj = StringIO() 
default_stdout = sys.stdout 
default_stdin = sys.stdin 
sys.stdout = stringIOObj 
sys.stdin = stringIOObj 

def method1_write(): 
     sys.stdout.write("Hello World\n") 
     sys.stdout.write("\n") #End of line 
     sys.stdout.flush() 

def method2_read(): 
     sys.stdout = default_stdout 
     for line in sys.stdin: 
      print line 

if __name__ == "__main__": 
     method1_write() 
     method2_read() 
     sys.stdin = default_stdin 

的目標有兩個方法來通過自定義標準輸出和標準輸入通信。我可以通過其他方式解決這個問題,但我試圖通過在同一模塊中使用writer和reader方法來消除少數命令行管道。

在這種情況下,沒有輸出寫入

>>> 
>>> 

不知道什麼時候就沒有拋出,以及錯誤有什麼不對這種方法。

回答

1

問題源於您使用相同的緩衝區。寫完之後,文件的位置就在最後,所以你什麼都不讀!所以,在你閱讀之前的某個時候,你必須要seek(0)。這工作:

def method1_write(): 
     sys.stdout.write("Hello World\n") 
     sys.stdout.write("\n") #End of line 
     sys.stdout.flush() 
     sys.stdout.seek(0) 

在任何情況下,你肯定應該使用一些爲情境管理器來實現這一點。看看這個問題上的代碼審查:

https://codereview.stackexchange.com/questions/98393/context-managers-that-also-deal-with-sys-stdin-and-sys-stdout

+0

這是清潔。我將使用Context Manager來解決這些問題。 – sysuser

+1

@sysuser如果你使用Python 3,'print'函數需要一個'file'關鍵字參數,讓你用print打印這個文件。您可以使用Python 2中的from __future__ import print_function'獲取該函數。 –

+0

謝謝,這將使我的任務更輕鬆。 – sysuser

0

通過更多實驗,找到了一個快速解決方案。以下作品。

import sys 
from cStringIO import StringIO 

stringIOObj = StringIO() 
default_stdout = sys.stdout 
sys.stdout = stringIOObj 

def method1_write(): 
     sys.stdout.write("Hello World") 
     sys.stdout.flush() 

def method2_read(): 
     sys.stdout = default_stdout 
     customStdIn = StringIO(stringIOObj.getvalue()) 
     for line in customStdIn: 
      print line 

if __name__ == "__main__": 
     method1_write() 
     method2_read() 

這打印出我想要的。

>>> 
Hello World 
>>> 

不確定爲什麼相同的StringIO對象不能用於輸入和輸出。

相關問題