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

如何在Python中显示重定向的stdin?,python,redirect,stdin,Python,Redirect,Stdin,我从一个Python项目开始,在这个项目中,stdin重定向是必要的,使用类似于以下的代码: 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) 问题是,代码运行后,将显示

我从一个Python项目开始,在这个项目中,stdin重定向是必要的,使用类似于以下的代码:

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)
问题是,代码运行后,将显示以下内容:

输入:你输入了:你好

是否有办法修改我的代码,以显示以下内容

输入:你好

你输入的是:你好

我到处寻找,但还没有找到答案。如果有人有主意,我将不胜感激。
谢谢

我不知道您为什么需要这样做,但您可以随时这样做:

a = raw_input("Type something: ")
if sys.stdin is not sys.__stdin__:
    print(a)
print("You typed in: "+a)
同样,根据需要将
原始输入
交换为您自己的实现可能更有意义

编辑:好的,根据你的评论,看起来你想做一些猴子补丁。大概是这样的:

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变得毫无意义。

编辑:在阅读了其他答案和评论后,我认为我找到了一个真正重定向stdin的好方法。注意,我假设您将知道最终用户的原始输入所需的输入

用户代码(命名为some_module.py)

您的测试脚本(随意命名)

收益率:

输入:你好

你输入的是:你好

这样做

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()

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

“stdin重定向是必要的”?真正地这似乎是不可能的情况。为什么不将
raw_input
替换为一个可调用的对象,它可以满足您的需要?我知道这不是一种常见的情况,但它确实是必要的。上面的代码只是一个非常简单的例子;事实上,我需要运行其他人要求输入的代码,所以我不能更改他们编写程序的方式。你不能更改他们的代码。你用你自己的版本重新定义一个内置函数,导入它们的代码,然后用你的版本运行它们的代码。哦,我明白你的意思了。然而,我仍然无法想到使用您的想法实现一个令人满意的方案。您是否介意发布一段代码示例,帮助我更接近解决方案?谢谢!谢谢你的回答!然而,这不是我需要的。我正在尝试运行其他人要求输入的代码,因此我无法更改他们的程序编写方式。听起来你应该将原始输入修补到自己的实现中。这正是我想要的!谢谢!我从来不知道我们可以用Python做这个疯狂的猴子补丁:)如果你使用3.x是有用的。谢谢你的回答,但这不是我需要的。我必须运行别人的代码,所以我不能改变他们编写程序的方式。我所能做的(据我所知)就是以某种方式操纵stdin和stdoutWould您是否介意提供更多的示例,说明它们的代码是什么以及您打算如何与之交互?意思是你想用你自己的数据控制他们程序的原始输入吗?是的,没错。我需要检查学生的答案,将数据输入到他们的函数中(通过提供参数或通过stdin),然后将stdout与提供的答案进行比较。很好的答案!然而,我发现IanB的代码更容易使用。不过,两者都能解决我的问题。谢谢!这种方法对没有分解成模块的代码有效吗?例如,如果给了一个没有定义函数或main的脚本,import命令不就运行该脚本吗(即在重新定义原始输入之前)?亚当·刘易斯:每个Python文件都是一个模块。根据定义。您无法避免将Python分解为模块。当你有一个“脚本”时,它就是一个模块。导入它将运行它。虽然您的注释有很多混乱之处,但它确实指出了需要进行的一项更改,以处理那些没有
的编写非常糟糕的脚本,如果[uuuuu name\uuuuuu==“\uuuuuu main”:
部分。关于模块注释的要点。你的改变解决了我想表达的问题。我之所以提出这个问题,是因为我可以看到老师的助手用这种方式给python作业评分。也就是说,如果是为了给家庭作业评分,我怀疑写得好的代码是否正常。谢谢你的澄清!事实上,adam你刚刚描述了我的确切情况(我是一名助手,写了一个自动检查学生答案的程序):)这就是为什么我自己不能更改部分代码的原因。再次感谢大家!
    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
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)
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()