我在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
    

    10-07 18:25