8

我将readline模块与 Python 2.7.3 和 Fedora 17 一起使用。我在 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)

所以这是我的两个问题:

  1. 这个逃脱角色怎么可能通过?
  2. 如何压制它?
4

3 回答 3

1

这是我正在使用的(诚然基于@jypeter 的回答),TERM仅当输出不进入 tty(例如被重定向到文件)时才清除环境变量:

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
于 2015-07-31T13:16:05.553 回答
0

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

import os
if os.environ['TERM'] == 'xterm':
    os.environ['TERM'] = 'vt100'
# Now it's OK to import readline :)
import readline
于 2014-08-22T14:56:21.563 回答
0

回答第一个问题:更改sys.stdout实际上并不影响标准输出的文件描述符指向的文件,而是 Python 认为是标准输出的高级文件对象。换句话说,更改sys.stdout会影响您的 Python 代码,但不会(通常)影响您可能正在使用的任何已编译扩展(如 readline 模块)。所有这些也适用sys.stderr

回答第二个:你可以按照这个答案的建议去做(这应该很容易移植到 Python)。尽管评论中的建议听起来像是一个更好的方法。

于 2014-08-07T22:33:26.380 回答