2014-01-18 7 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

コンテキストマネージャを簡単に書くことができるので、 'with swapping_stdout:'と書くことができます。そして、 'with'ステートメントで関数を単にラップするデコレータを簡単に書くことができます。しかし、これがあなたがやっている唯一の場所なら、それはもっと簡単ではありません。 ([here](http://pastebin.com/5L9YhnHn)を参照してください。)汎用のattr-swappingコンテキストが必要な場合は簡単ですが、名前空間とattr名を文字列として渡す必要があります'swapping_attr(sys、 'stdout'、sys.stderr):'のように、私は改善がないと思います。 (MacroPyはうまくいくかもしれませんが、これだけのためにMacroPyは使用しません...) – abarnert

+0

また、この特定の場合の一般的なやり方は、 'old_stdout'を隠す代わりに' sys .__ stdout__'を使うことです。 – abarnert

13

raw_inputの唯一の問題は、プロンプトをstdoutに出力することです。プロンプトを表示せずに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が、それはinputと改名されています、最初の場所でraw_inputはありませんが、同じ考え方を使用することができます。)

+0

+1、ニース '__builtins __。raw_input()'トリック。 – falsetru

+1

'sys.stderr。代わりに['raw_input'](http://docs.python.org/2/library/functions.html#raw_input)のように動作させるためにwrite(str(prompt))'を使うべきです。 – falsetru

+1

@falsetru:そうですね、あなたはそうだと思います。しかし、あなたの編集のために、['__builtin__'](http://docs.python.org/2/library/__builtin__.html)は正しい名前です。 '__builtins__'は' __builtin__'または '__builtin __.__ dict__'のモジュールレベルオブジェクトのCPython固有の名前です。しかし、私は '__builtins__'が' import'なしでそこにいることが保証されているかどうか分からないので、追加します。 – abarnert

0

使用getpass

import getpass 

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

を。これは、内容を印刷しますvalue stdoutにEnter Name:を追加します。

python 2.7および3.6で動作確認済みです。

関連する問題