Python readline模块在导入期间打印转义字符

Python readline模块在导入期间打印转义字符,python,import,stdout,readline,io-redirection,Python,Import,Stdout,Readline,Io Redirection,我在Python2.7.3和Fedora17中使用readline模块。我在Ubuntu 12.10中没有这个问题 在导入readline期间,将显示转义字符 $python-c“导入读取行”|更少 电子稳定控制系统[?1034h(结束) 通常,当我得到像这样的意外输出时,我使用stdout/stderr重定向到一个虚拟文件描述符(下面的示例)来处理它。但是这次,这种方法不起作用 导入系统 类DummyOutput(对象): def写入(自身,字符串): 通过 类输出(对象): “”“上下文正

我在Python2.7.3和Fedora17中使用
readline
模块。我在Ubuntu 12.10中没有这个问题

在导入readline期间,将显示转义字符

$python-c“导入读取行”|更少
电子稳定控制系统[?1034h(结束)
通常,当我得到像这样的意外输出时,我使用
stdout/stderr
重定向到一个虚拟文件描述符(下面的示例)来处理它。但是这次,这种方法不起作用

导入系统 类DummyOutput(对象): def写入(自身,字符串): 通过 类输出(对象): “”“上下文正在抑制stdout/stderr输出。 """ 定义初始化(自): 通过 定义输入(自我): sys.stdout=DummyOutput() sys.stderr=DummyOutput() 定义uuu退出uuu(自我,*uu): sys.stdout=sys.\u stdout__ sys.stderr=sys.\u stderr__ 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': 打印“开始” 使用suppress_output(): #这两个打印语句没有任何效果 #但*导入readline*打印转义字符 打印“导入前” 导入读线 “导入后”打印 #将显示这一个 打印“结束” 如果在
test.py
脚本中运行此代码段,您将看到在
suppress\u output
上下文中,
print
语句确实被抑制,但转义字符没有

$python test.py |更少
开始
电子稳定控制系统[?1034结束
(完)
下面是我的两个问题:

  • 这个转义角色怎么可能通过
  • 如何抑制它

  • 回答第一个问题:更改
    sys.stdout
    实际上不会影响什么文件,而只会影响Python认为是stdout的高级文件对象。换言之,更改
    sys.stdout
    会影响Python代码,但(通常)不会影响您可能正在使用的任何编译扩展(如readline模块)。所有这一切也适用于
    sys.stderr


    回答第二个问题:你可以做建议的事情(移植到Python应该很简单)。尽管注释中的建议听起来是更好的方法。

    在导入readline之前,我使用了以下技巧

    import os
    if os.environ['TERM'] == 'xterm':
        os.environ['TERM'] = 'vt100'
    # Now it's OK to import readline :)
    import readline
    
    以下是我正在使用的(当然是基于@jypeter的答案),仅当输出未转到tty(例如,被重定向到文件)时,才清除
    术语
    环境变量:


    看起来模块想用转义序列更改终端状态,但这不起作用。您不应该尝试解决这个问题,而是要解决它。是的,这里有一个基于此的解决方法。但这并没有回答我的第一个问题:)(我担心这不是很方便,但我可能错了)。我怀疑是您的终端和/或terminfo DB导致了此问题。我从MacBook和
    TERM=xterm-256color
    通过ssh连接到RedHat机器时遇到此问题。我认为这是一个读线设置错误。目前我能做的最好的方法是使用
    export TERM=vt100
    解决此问题。相关的python错误也出现在
    xterm-25中6color
    但是设置
    os.environ['TERM']=''
    然后导入
    readline
    ,然后将
    os.environ['TERM']
    还原到原来的状态,避免打印转义序列(但不确定
    readline
    的其他功能…)
    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