[英]Python readline module prints escape character during import
我將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)
所以這是我的兩個問題:
這是我正在使用的(基於@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
回答第一個問題:更改sys.stdout
實際上並不影響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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.