我正在开始一个需要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
我一直在寻找高低,但尚未找到答案。如果有人有想法我真的很感激。 谢谢!
答案 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