簡體   English   中英

Python readline模塊在導入期間打印轉義字符

[英]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)

所以這是我的兩個問題:

  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

回答第一個問題:更改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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM