我正在使用带有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)
所以这是我的两个问题:
答案 0 :(得分:1)
这是我正在使用的(诚然基于@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
答案 1 :(得分:0)
回答第一个问题:更改sys.stdout
实际上并不会影响文件stdout's file descriptor is pointing at,而只会影响Python认为是stdout的高级文件对象。换句话说,更改sys.stdout
会影响您的Python代码,但不会(通常)影响您可能正在使用的任何编译扩展(如readline模块)。所有这些也适用于sys.stderr
。
回答第二个问题:你可以做this answer建议的事情(这应该是直接移植到Python)。虽然评论中的建议听起来像是一种更好的方式。
答案 2 :(得分:0)
我在导入readline之前使用了以下hack
import os
if os.environ['TERM'] == 'xterm':
os.environ['TERM'] = 'vt100'
# Now it's OK to import readline :)
import readline