Как отобразить перенаправленный стандартный ввод в Python? - PullRequest
7 голосов
/ 28 апреля 2011

Я запускаю проект 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)

Проблема в том, что после запуска кода отображается следующее:

Введите что-нибудь: Вы ввели: Hello

Есть ли способ изменить мой код так, чтобы вместо него отображалось следующее?

Введите что-то: Привет

Вы ввели: Привет

Я искал все выше и ниже, но пока не нашел ответа.Я буду очень признателен, если у кого-нибудь есть идея.Спасибо!

Ответы [ 3 ]

3 голосов
/ 28 апреля 2011

Сделай это.

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. Ваш может сделать что угодно , чтобы обеспечить ложные входы и поддельные выходы.

3 голосов
/ 28 апреля 2011

Я не уверен, зачем вам это нужно, но вы всегда можете сделать это:

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 голос
/ 28 апреля 2011

РЕДАКТИРОВАТЬ: После прочтения других ответов и комментариев, я думаю, я нашел хороший способ действительно перенаправить стандартный ввод. Обратите внимание, что я предположил, что вы будете знать, что входные данные для 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: значение 3
стандартное значение: значение 3
Это чужой код, запрашивающий его (3) raw_input: значение 1
стандартное значение: значение 1
Это чужой код, запрашивающий его (4) raw_input: значение 2
стандартное значение: значение 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

Вы ввели: Привет

...