2010-10-27 11 views
7

मैंने एक बहुत ही सरल इंटरैक्टिव कंसोल बनाया है जिसे मैं एक जटिल स्क्रैपिंग एप्लिकेशन में उपयोग करना चाहता हूं। यह इस तरह दिखता है:मेरा पायथन इंटरैक्टिव कंसोल ठीक से काम क्यों नहीं करता है?

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import os, sys, codecs, code 
sys.__stdout__ = codecs.getwriter('utf8')(sys.__stdout__) 
sys.__stderr__ = codecs.getwriter('utf8')(sys.__stderr__) 

if 'DEBUG' in os.environ: 
    import pdb 
    import sys 
    oeh = sys.excepthook 
    def debug_exceptions(type, value, traceback): 
     pdb.post_mortem(traceback) 
     oeh(type, value, traceback) 
    sys.excepthook = debug_exceptions 

class CLI(code.InteractiveConsole): 
    def __init__(self, locals=None, filename="<console>", histfile=None): 
     code.InteractiveConsole.__init__(self, locals, filename) 
     try: 
      import readline 
     except ImportError: 
      pass 
     else: 
      try: 
       import rlcompleter 
       readline.set_completer(rlcompleter.Completer(locals).complete) 
      except ImportError: 
       pass 
      readline.parse_and_bind("tab: complete") 
     self.interact() 

if __name__ == "__main__": 
    hello="I am a local" 
    CLI(locals=locals()) 

अगर मैं एक और सरल आवेदन से इसे कहते है, यह सिर्फ ठीक काम करता है:

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 

import os, sys, codecs, cli 
sys.__stdout__ = codecs.getwriter('utf8')(sys.__stdout__) 
sys.__stderr__ = codecs.getwriter('utf8')(sys.__stderr__) 

from cli import CLI 

foo="i am a local" 
CLI(locals=locals()) 

हालांकि, जब मैं अपने scraping ढांचे से इसे कहते जो टवील बंद आधारित है और मशीनीकरण है अभी के लिए (हालांकि मैं इसे gevent पर स्विच करना चाहता हूं) जब सीएलआई को ठीक उसी तरह कॉल करें, तीर कुंजियां काम नहीं करती हैं, टैब पूर्णता काम नहीं करती है, असल में यह रीडलाइन की तरह व्यवहार करता है। मैंने रीडलाइन मॉड्यूल को पुनः लोड करने और इसे सीधे parse_and_bind कमांड पास करने का प्रयास किया है, लेकिन किसी कारण से यह ठीक से नहीं खेलेंगे। किसी भी संकेत या सुझाव जो कि क्लॉबर्ड किए गए हैं, जो इसे अपेक्षित रूप से काम करने से रोक रहा है या क्या मुझे बस उपयोग में आने वाले सभी बाहरी मॉड्यूल को हटाना होगा और यह देखने के लिए कि एक बार क्या हुआ?

मुझे टवील देखने की संदिग्धता है क्योंकि इसकी अपनी मूल सीएलआई है लेकिन अगर कोई जानता है तो मुझे यह जानकर बहुत खुशी होगी कि क्या किसी के पास अच्छा विचार है कि क्या हो रहा है।

ओह और कृपया मुझे कोई टिप्पणी नहीं है कि मैं stderr और stdout के साथ क्या कर रहा हूं, यह सिर्फ बॉयलरप्लेट कोड है जो पाइथन फाइलों में डालता है, मैं हमेशा उन्हें utf8 कंसोल से चलाता हूं और यह नहीं है कि मैं इसके बारे में क्या पूछ रहा हूं ... पुराने कोड अभी भी मौजूद थे

sys.stdout = codecs.getwriter('utf8')(sys.stdout) 
sys.stderr = codecs.getwriter('utf8')(sys.stderr) 

कि:

+0

मैंने कुछ और आयात करने से पहले सीएलआई ऑब्जेक्ट बनाने की कोशिश की या फिर stderr और stdout को संशोधित करने की कोशिश की .interact() बाद में, यह अभी भी व्यवहार करता है जैसे कोई रीडलाइन नहीं है। – user376403

उत्तर

3

ठीक है, मुझे पता चला है कि यह मुझे है कि समस्या पैदा कर रहा था, मेरे पुराने बॉयलर-प्लेट मैंने पहले इस के लिए इस्तेमाल किया कोड यह कुछ मामलों में समस्याओं के कारण देखा मेरी अपनी फाइलों में से एक में, उस कोड को निम्न-स्तर के संस्करण में बदलना:

sys.__stdout__ = codecs.getwriter('utf8')(sys.__stdout__) 
sys.__stderr__ = codecs.getwriter('utf8')(sys.__stderr__) 

या इसे पूरी तरह से हटा रहा है, क्योंकि उस फ़ाइल में होने की आवश्यकता नहीं है, फिर भी इस मुद्दे को ठीक किया गया है।

संबंधित मुद्दे