2017-01-05 50 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对象不能用于输入和输出。

相关问题