2014-01-18 7 views

ответ

2

Перенаправить stdout в stderr временно, а затем восстановить.

import sys 

old_raw_input = raw_input 
def raw_input(*args): 
    old_stdout = sys.stdout 
    try: 
     sys.stdout = sys.stderr 
     return old_raw_input(*args) 
    finally: 
     sys.stdout = old_stdout 
+0

Есть ли простой способ сделать это. – Samuel

+0

Вы можете легко написать менеджер контекста, чтобы вы могли написать 'с помощью swapping_stdout:'. И вы можете легко написать декоратор, который просто обертывает функцию в этой инструкции 'with'. Но если это единственное место, где вы это делаете, это не будет проще. (См. [Здесь] (http://pastebin.com/5L9YhnHn).) Если вам нужен контекст общего доступа attr-swapping, это легко ... но вам нужно передать ему пространство имен и имя attr в виде строки , например 'с swapping_attr (sys, 'stdout', sys.stderr):', который, я думаю, не является улучшением. (MacroPy может сделать это красиво, но я бы не использовал MacroPy только для этого ...) – abarnert

+0

Кроме того, общий трюк для этого конкретного случая - использовать 'sys .__ stdout__' вместо stashing' old_stdout'. – abarnert

13

Единственная проблема с raw_input является то, что она выводит подсказку на стандартный вывод. Вместо того, чтобы пытаться перехватить это, почему бы просто не распечатать запрос самостоятельно и вызвать raw_input без приглашения, которое ничего не печатает в stdout?

def my_input(prompt=None): 
    if prompt: 
     sys.stderr.write(str(prompt)) 
    return raw_input() 

И если вы хотите заменить raw_input с этим:.

import __builtin__ 
def raw_input(prompt=None): 
    if prompt: 
     sys.stderr.write(str(prompt)) 
    return __builtin__.raw_input() 

(Для получения дополнительной информации см документации на __builtin__, модуль, raw_input и другие built-in functions хранятся в Вы обычно надеваете» t должно быть import, но в документах нет ничего, что гарантирует, что лучше быть в безопасности ...)

В Python 3.2+ вместо этого модуль называется builtins от __builtin__. (Конечно 3.x не raw_input в первую очередь, это был переименован input, но та же идея может быть использована там.)

+0

+1, Nice '__builtins __. Raw_input()' трюк. – falsetru

+1

'sys.stderr.write (str (prompt)) 'следует использовать вместо этого, чтобы заставить его вести себя как [' raw_input'] (http://docs.python.org/2/library/functions.html#raw_input). – falsetru

+1

@falsetru: Да, я думаю, вы правы в этом. Но для вашего редактирования имя '' __builtin__' (http://docs.python.org/2/library/__builtin__.html) является правильным именем; '__builtins__' - это специфичное для CPython имя для объекта уровня модуля, либо' __builtin__', либо '__builtin __.__ dict__'. Тем не менее, я не уверен, что '__builtins__' гарантированно будет там без' import', поэтому я добавлю это. – abarnert

0

Использование getpass

import getpass 

value=getpass.getpass("Enter Name: ") 
print(value) 

Это будет печатать содержание value на stdout и Enter Name: на stderr.

Протестировано и работает с python 2.7 и 3.6.

Смежные вопросы