自定义stdout和stdin用于在同一模块中编写和读取数据 - Python

时间:2017-01-05 22:06:12

标签: python subprocess

我在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

目标是通过自定义stdout和stdin进行通信的两种方法。我可以通过其他方式解决这个问题,但我试图通过在同一模块中使用编写器和读取器方法来消除少量命令行管道。

在这种情况下,没有写入输出

>>> 
>>>

当没有错误抛出时,不确定这种方法有什么问题。

2 个答案:

答案 0 :(得分: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)

无论如何,你绝对应该使用一些上下文管理器来实现这一目标。在CodeReview上查看这个问题:

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

答案 1 :(得分: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对象不能用于输入和输出。