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

标签 python import stdout readline io-redirection

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

所以这是我的两个问题:

  1. 这个转义符怎么可能通过?
  2. 如何抑制?

最佳答案

这是我正在使用的(诚然基于@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

关于Python readline 模块在导入期间打印转义字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15760712/

相关文章:

c# - 如何将数据从托管程序集流式传输到 native 库并再次返回?

python - 按降序将两个排序列表合并为一个

python - MySQLdb安装问题

mysql - 从 MySQL 迁移到 mongo 的空值

python - "No Module named..."- 尽管代码似乎有效,但编辑器中出现错误

ruby - 如何从 Ruby 程序中逐行读取另一个程序的 STDOUT?

Python Linter 表示方法调用中的值在已修补的单元测试中丢失,但测试运行正常。为什么?

python - Django ORM 中的复杂查询

python - 尝试使用 Python 从 excel 电子表格中删除第一行

php - 工作两年后突然出现 MYSQL "Malformed packet"on LOAD DATA LOCAL INFILE