2013-04-02 7 views
8

मैं फेडोथन 2.7.3 के साथ readline मॉड्यूल का उपयोग कर रहा हूं। मुझे उबंटू 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 बयान वास्तव में कर रहे दबा, लेकिन नहीं बच चार देखेंगे।

  1. कैसे यह संभव इस एस्केप वर्ण के लिए के माध्यम से प्राप्त करने के लिए है:

    $ python test.py |less 
    Begin 
    ESC[?1034hEnd 
    (END) 
    

    तो यहाँ मेरे दो सवाल कर रहे हैं?

  2. इसे दबाने के लिए कैसे करें?
+1

ऐसा लगता है कि मॉड्यूल टर्मिनल स्थिति को बचने के क्रम में बदलना चाहता है लेकिन यह काम नहीं करता है। आपको इसके आसपास काम करने की कोशिश नहीं करनी चाहिए, इसके बजाय इसे ठीक करें। – wRAR

+0

हां, यहां पर एक वर्कअराउंड है जो http://reinout.vanrees.org/weblog/2009/08/14/readline-invisible-character-hack.html पर आधारित है। लेकिन इसने मेरे पहले सवाल का जवाब नहीं दिया :) (और मुझे डर था कि बहुत पोर्टेबल नहीं था, लेकिन मैं गलत हो सकता हूं)। – Alex

+0

मुझे संदेह है कि आपका टर्मिनल और/या टर्मिनो डीबी इस समस्या का कारण बनता है। – wRAR

उत्तर

0

पहले सवाल का जवाब करने के लिए: बदलते sys.stdout वास्तव में क्या stdout's file descriptor is pointing at फाइल को प्रभावित नहीं करता है, लेकिन बजाय सिर्फ उच्च स्तरीय फ़ाइल वस्तु अजगर समझता है stdout किया जाना है। एक और तरीका कहा, sys.stdout बदलना आपके पायथन कोड को प्रभावित करता है, लेकिन (आमतौर पर) किसी भी संकलित एक्सटेंशन का उपयोग नहीं कर सकता है (जैसे रीडलाइन मॉड्यूल)। यह सब sys.stderr पर भी लागू होता है।

दूसरे का उत्तर देने के लिए: आप this answer सुझाव दे सकते हैं (जो पाइथन के लिए बंदरगाह के लिए सीधा होना चाहिए)। हालांकि टिप्पणियों में सुझाव जाने के बेहतर तरीके की तरह लगते हैं।

+0

यहां [पायथन में सी स्तर पर stdout को पुनर्निर्देशित करने के लिए कैसे करें] (http://stackoverflow.com/a/22434262/4279) – jfs

0

मैं निम्नलिखित हैक का इस्तेमाल किया है, ReadLine

import os 
if os.environ['TERM'] == 'xterm': 
    os.environ['TERM'] = 'vt100' 
# Now it's OK to import readline :) 
import readline 
+1

समस्या भी ' xterm-256color' –

+0

लेकिन 'os.environ ['TERM'] = '' 'को सेट करना, फिर' readline' आयात करना और फिर 'os को पुनर्स्थापित करना।पर्यावरण ['TERM'] 'बचने के अनुक्रम को मुद्रित करने से पहले जो था उससे पहले वापस (हालांकि' readline' की अन्य कार्यक्षमता के बारे में निश्चित नहीं है ...) –

1
यहाँ

आयात करने से पहले मैं क्या उपयोग कर रहा हूँ (वैसे @jypeter के उत्तर के आधार पर), TERM वातावरण चर समाशोधन ही अगर उत्पादन नहीं करता है एक tty पर जाएं (उदाहरण के लिए फ़ाइल में रीडायरेक्ट किया जा रहा है):

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 
संबंधित मुद्दे