我在Fedora 17和Python 2.7.3中使用了readline
模块。在Ubuntu 12.10中没有这个问题。
在import readline
期间,将显示转义字符。
$ python -c 'import readline' |less
ESC[?1034h(END)
通常,当我得到这样的意外输出时,我会使用
stdout/stderr
重定向到伪文件描述符来处理它(下面的示例)。但是这次,这种方法不起作用。import sys
class DummyOutput(object):
def write(self, string):
pass
class suppress_output(object):
"""Context suppressing stdout/stderr output.
"""
def __init__(self):
pass
def __enter__(self):
sys.stdout = DummyOutput()
sys.stderr = DummyOutput()
def __exit__(self, *_):
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
if __name__ == '__main__':
print 'Begin'
with suppress_output():
# Those two print statements have no effect
# but *import readline* prints an escape char
print 'Before importing'
import readline
print 'After importing'
# This one will be displayed
print 'End'
如果在
test.py
脚本中运行此代码段,您会看到在suppress_output
上下文中,确实抑制了print
语句,但没有抑制转义字符。$ python test.py |less
Begin
ESC[?1034hEnd
(END)
所以这是我的两个问题:
最佳答案
这是我正在使用的(基于@jypeter的答案),仅在输出未发送到tty(例如将重定向到文件)的情况下才清除TERM
环境变量:
if not sys.stdout.isatty():
# remember the original setting
oldTerm = os.environ['TERM']
os.environ['TERM'] = ''
import readline
# restore the orignal TERM setting
os.environ['TERM'] = oldTerm
del oldTerm