2014-01-18 48 views

回答

2

暫時重定向stdoutstderr然後恢復。

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'語句包裝函數。但是,如果這是你做這件事的唯一地方,它不會更簡單。 (見[here](http://pastebin.com/5L9YhnHn)。)如果你想要一個通用的attr-swapping上下文,那很容易......但是你必須把它的名字空間和attr名字作爲一個字符串,像'用swapping_attr(sys,'stdout',sys.stderr):',我不認爲這是一種改進。 (MacroPy可以使它更好,但我不會爲此僅使用MacroPy) – abarnert

+0

此外,這種特定情況下的一個常見技巧是使用'sys .__ stdout__'而不是將'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_inputbuilt-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一起工作。

相關問題