如何在Python中显示重定向的stdin?

时间:2011-04-28 00:40:12

标签: python redirect stdin

我正在开始一个需要stdin重定向的Python项目,使用类似下面的代码:

import sys
import StringIO

s = StringIO.StringIO("Hello")
sys.stdin = s
a = raw_input("Type something: ")
sys.stdin = sys.__stdin__
print("You typed in: "+a)

问题是,代码运行后,会显示以下内容:

  

输入内容:您输入了:Hello

有没有办法修改我的代码,以便显示以下内容?

  

输入内容:Hello

     

您输入了:Hello

我一直在寻找高低,但尚未找到答案。如果有人有想法我真的很感激。 谢谢!

3 个答案:

答案 0 :(得分:3)

我不确定你为什么需要,但你总能做到这一点:

a = raw_input("Type something: ")
if sys.stdin is not sys.__stdin__:
    print(a)
print("You typed in: "+a)

然后,根据需要交换raw_input以进行自己的实现可能会更有意义。

编辑:好的,根据您的评论,您似乎想要做一些猴子修补。像这样:

old_raw_input = raw_input

def new_raw_input(prompt):
    result = old_raw_input(prompt)
    if sys.stdin is not sys.__stdin__:
        print result
    return result

raw_input = new_raw_input

当然,这可能会使重定向stdin无法实现。

答案 1 :(得分:3)

这样做。

class MyRawInputFakeOutObject( object ):
    def __init__( self, the_fake_out_input_text ):
        self.input= the_fake_out_input_text
    def __call__( self, prompt ):
        print( prompt )
        return self.input

raw_input= MyRawInputFakeOutObject( "Hello" )

import some_existing_module

some_existing_module.the_existing_main()

现在,现有模块正在使用raw_input,而不是内置raw_input。你可以做任何事情来提供假输入和虚假输出。

答案 2 :(得分:1)

编辑:在阅读完其他答案和评论之后,我想我找到了一个真正重定向标准输入的好方法。请注意,我假设您将知道最终用户的raw_inputs输入需要。

用户代码(名为some_module.py)

print "running some module with 5 raw_input requests"
for x in range(5):
    value = raw_input("This is someone else's code asking its (" + str(x) + ") raw_input: ")
    print 'stdin value: ' + value

您的测试脚本(根据您的喜好命名)

    import sys
    class MY_STD_IN( object ):
        def __init__(self, response_list):
            self.std_in_list = response_list
            self.std_in_length = len(response_list)
            self.index = 0

        def readline(self):
            value = self.std_in_list[self.index]      
            print value
            if self.index < self.std_in_length -1:
                self.index += 1
            else:
                self.index = 0

            return value

    predetermined_stdin_responses = ['Value 1\r', 'Value 2\r', 'Value 3\r']
    sys.stdin = MY_STD_IN( predetermined_stdin_responses )

    import some_module

运行脚本产量

  

运行一些带有5个raw_input请求的模块
  这是其他人的代码询问其(0)raw_input:值1
  标准值:值1
  这是其他人的代码询问其(1)raw_input:值2
  标准值:值2
  这是别人的代码询问其(2)raw_input:Value 3
  标准值:值3
  这是其他人的代码询问其(3)raw_input:值1
  标准值:值1
  这是其他人的代码询问其(4)raw_input:值2
  stdin值:值2

原始答案

不确定您是否正在寻找这样一个字面答案,但这里是

import sys
import StringIO

s = StringIO.StringIO("Hello")
sys.stdin = s
a = raw_input("Type something: ")
sys.stdin = sys.__stdin__
print(a+"\nYou typed in: "+a)

收率:

  
    

输入内容:Hello

         

您输入了:Hello