Python readline模块在导入期间打印转义字符
我在Python2.7.3和Fedora17中使用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写入(自身,字符串): 通过 类输出(对象): “”“上下文正
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