मैंने एक बहुत ही सरल इंटरैक्टिव कंसोल बनाया है जिसे मैं एक जटिल स्क्रैपिंग एप्लिकेशन में उपयोग करना चाहता हूं। यह इस तरह दिखता है:मेरा पायथन इंटरैक्टिव कंसोल ठीक से काम क्यों नहीं करता है?
#!/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)
कि:
मैंने कुछ और आयात करने से पहले सीएलआई ऑब्जेक्ट बनाने की कोशिश की या फिर stderr और stdout को संशोधित करने की कोशिश की .interact() बाद में, यह अभी भी व्यवहार करता है जैसे कोई रीडलाइन नहीं है। – user376403