2011-12-19 26 views
6

के साथ पायथन ट्विस्ट एकीकरण मुझे पाइथन की Twisted और Cmd पसंद है। मैं उन्हें एक साथ उपयोग करना चाहता हूं।सीएमडी मॉड्यूल

मुझे कुछ चीजें काम कर रही हैं, लेकिन अब तक मुझे यह पता नहीं चला है कि टैब-पूरा करने का काम कैसे किया जाए, क्योंकि मुझे नहीं लगता कि ट्विस्टेड लाइन रिसीवर में तुरंत टैब कीपर्स ईवेंट कैसे प्राप्त करें (एंटर दबाए बिना)।

#!/usr/bin/env python 

from cmd import Cmd 
from twisted.internet import reactor 
from twisted.internet.stdio import StandardIO 
from twisted.protocols.basic import LineReceiver 

class CommandProcessor(Cmd): 
    def do_EOF(self, line): 
     return True 

class LineProcessor(LineReceiver): 
    from os import linesep as delimiter # makes newline work 

    def __init__(self): 
     self.processor = CommandProcessor() 
     self.setRawMode() 

    def connectionMade(self): 
     self.transport.write('>>> ') 

    def rawDataReceived(self, data): 
     self.processor.onecmd(data) 
     self.transport.write('>>> ') 

StandardIO(LineProcessor()) 
reactor.run() 

अलावा टैब पूरा होने से, यह कुछ हद तक काम करता है:

यहाँ मेरी कोड अब तक है। मैं "मदद" जैसे कमांड दर्ज कर सकता हूं और सीएमडी मॉड्यूल परिणाम प्रिंट करेगा। लेकिन मैंने सीएमडी मॉड्यूल की निफ्टी टैब-पूर्ण कार्यक्षमता खो दी है, क्योंकि ट्विस्ट एक समय में एक पंक्ति को बफर कर रहा है। मैंने खाली स्ट्रिंग में LineProcessor.delimiter सेट करने का प्रयास किया, इसका कोई फायदा नहीं हुआ। शायद मुझे LineReceiver के बजाय उपयोग करने के लिए मुड़ने का कुछ और टुकड़ा ढूंढना होगा? या शायद एक आसान दृष्टिकोण है जो हर चरित्र को एक-एक करके संसाधित करने से बच जाएगा?

मैं अकेले सीएमडी का उपयोग नहीं कर सकता, क्योंकि मैं इसे एक नेटवर्क एप्लिकेशन बनाना चाहता हूं, जहां कुछ आदेश डेटा भेजना होगा, और नेटवर्क से डेटा प्राप्त करना असीमित रूप से होगा (और उपयोगकर्ता को प्रदर्शित किया जाएगा)।

तो क्या हम उपर्युक्त कोड या कुछ पूरी तरह से अलग से शुरू करते हैं, मैं पाइथन में एक अच्छा, दोस्ताना टर्मिनल एप्लिकेशन बनाना चाहता हूं जो नेटवर्क घटनाओं और टैब पूर्ण करने के लिए प्रतिक्रिया देता है। मुझे उम्मीद है कि मैं पहले से बाहर क्या कर सकता हूं और खुद को बहुत अधिक लागू नहीं करना है।

+0

[मुड़ मैनहोल] (http://twistedmatrix.com/trac/wiki/TwistedConch), [उदाहरण] (http://twistedmatrix.com/documents/current/conch पर एक नज़र /examples/demo_manhole.tac) – jfs

+0

मैंने मैनहोल और कोच को देखा लेकिन उन्होंने जो कुछ भी कर रहा है उसके लिए उन्होंने मुझे बहुत समझ नहीं दी। दस्तावेज कॉन्च को क्लाइंट और सर्वर दोनों, एसएसएचवी 2 कार्यान्वयन के रूप में वर्णित करता है, और दिखाता है कि आप एक एसएसएच सर्वर कैसे बना सकते हैं जो अपने ग्राहकों के लिए रंगीनकरण करता है। मेरी जरूरतें दोनों समान और अलग हैं। यदि आपके पास मैनहोल का उपयोग करने का एक और अधिक विशिष्ट सुझाव है, तो मैं सभी कान हूं ... इसके साथ की समस्याओं में से एक दस्तावेज की एक स्पष्ट कमी है। –

उत्तर

9

आप इस दृष्टिकोण के साथ कठिनाइयों के एक जोड़े हैं:

  • Cmd.onecmd किसी भी टैब प्रसंस्करण करने के लिए नहीं जा रहा है।
  • यहां तक ​​कि अगर ऐसा होता है, तो आपके टर्मिनल को पाइथन दुभाषिया (tty.setcbreak) की देखभाल करने के लिए अलग-अलग कीस्ट्रोक के लिए क्रैक मोड में होना आवश्यक है।
  • जैसा कि आप जानते हैं, Cmd.cmdloop रिएक्टर को अवगत नहीं है और इनपुट के लिए प्रतीक्षा अवरुद्ध कर देगा।
  • फिर भी, आप चाहते हैं कि सभी शांत लाइन-संपादन प्राप्त करने के लिए, सीएमडी (वास्तव में रीडलाइन) को स्टडीन और स्टडआउट तक सीधे पहुंच की आवश्यकता है।

इन सभी कठिनाइयों को देखते हुए, आप कमांडप्रोसेसर को अपने धागे में चलाने की अनुमति दे सकते हैं। उदाहरण के लिए:

#!/usr/bin/env python 

from cmd import Cmd 
from twisted.internet import reactor 

class CommandProcessor(Cmd): 
    def do_EOF(self, line): 
     return True 

    def do_YEP(self, line): 
     reactor.callFromThread(on_main_thread, "YEP") 

    def do_NOPE(self, line): 
     reactor.callFromThread(on_main_thread, "NOPE") 

def on_main_thread(item): 
    print "doing", item 

def heartbeat(): 
    print "heartbeat" 
    reactor.callLater(1.0, heartbeat) 

reactor.callLater(1.0, heartbeat) 
reactor.callInThread(CommandProcessor().cmdloop) 
reactor.run() 
+0

मैं टैब कुंजीपटल पर सीएमडी मॉड्यूल में पूर्णता विधियों को कॉल करने के बारे में सोच रहा था। बकवास को इंगित करने के लिए धन्यवाद - मुझे इसके बारे में पता नहीं था। मैं आपके दृष्टिकोण की कोशिश करूंगा, इसे लिखने के लिए धन्यवाद। –

+0

आपका स्वागत है। असल में, रीडलाइन एक मिनी शाप आवेदन है। मुझे लगता है कि अगर आप stdin/stdout तक पहुंच में मध्यस्थता करने का प्रयास करते हैं तो आप इसकी अधिकांश कार्यक्षमताओं को फिर से लागू कर सकते हैं। यह थ्रेडेड दृष्टिकोण चलो यह सीधे stdin/stdout (क्रैब मोड सहित) का प्रबंधन करता है जो चीजों को सरल रखना चाहिए। –

+0

twisted.internet.threads.blockingCallFromThread एक बहुत उपयोगी ट्विस्ट फ़ंक्शन है जो कमांडप्रोसेसर को रिटर्न वैल्यू प्राप्त करने की अनुमति देता है। –

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