问题
I want to redirect the stdout
to a file. But This will affect the raw_input
. I need to redirect the output of raw_input
to stderr
instead of stdout
. How can I do that?
回答1:
Redirect stdout
to stderr
temporarily, then restore.
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
回答2:
The only problem with raw_input
is that it prints the prompt to stdout. Instead of trying to intercept that, why not just print the prompt yourself, and call raw_input
with no prompt, which prints nothing to stdout?
def my_input(prompt=None):
if prompt:
sys.stderr.write(str(prompt))
return raw_input()
And if you want to replace raw_input
with this:
import __builtin__
def raw_input(prompt=None):
if prompt:
sys.stderr.write(str(prompt))
return __builtin__.raw_input()
(For more info, see the docs on __builtin__, the module that raw_input
and other built-in functions are stored in. You usually don't have to import
it, but there's nothing in the docs that guarantees that, so it's better to be safe…)
In Python 3.2+, the module is named builtins instead of __builtin__
. (Of course 3.x doesn't have raw_input
in the first place, it's been renamed input, but the same idea could be used there.)
回答3:
Use getpass
import getpass
value=getpass.getpass("Enter Name: ")
print(value)
This will print the content value
to stdout and Enter Name:
to stderr.
Tested and works with python 2.7 and 3.6.
来源:https://stackoverflow.com/questions/21202403/how-to-redirect-the-raw-input-to-stderr-and-not-stdout