2009-01-12 10 views
12

मैं एक अजगर आधारित एप्लिकेशन है कि एक साधारण पढ़ने के eval-print-पाश में कुछ आदेशों को स्वीकार कर सकते हैं। मैं इनपुट प्राप्त करने के लिए raw_input('> ') का उपयोग कर रहा हूं। यूनिक्स-आधारित सिस्टम पर, मैं चीजों को थोड़ा बेहतर बनाने के लिए import readline भी करता हूं। यह सब ठीक काम कर रहा है।एक पायथन आरईपीएल को कैसे कार्यान्वित करें जो अच्छी तरह से असीमित आउटपुट को संभालता है?

समस्या अतुल्यकालिक घटनाओं में आ रहा है देखते हैं, और मैं जैसे ही वे ऐसा उत्पादन प्रिंट करना चाहते हैं कि है। दुर्भाग्य से, यह चीजें बदसूरत लगती है। ">" स्ट्रिंग आउटपुट के बाद फिर से दिखाई नहीं दे रही है, और यदि उपयोगकर्ता टाइपिंग के माध्यम से आधा रास्ते है, तो यह अपने पाठ को आधे में चॉप करता है। इसे प्रिंट करने के बाद शायद उपयोगकर्ता की टेक्स्ट-इन-प्रोग्रेस को फिर से खींचा जाना चाहिए।

यह लगता है जैसे कि यह एक हल समस्या होना चाहिए। ऐसा करने का सही तरीका क्या है?

भी ध्यान रखें कि अपने कुछ उपयोगकर्ताओं के Windows- आधारित हैं।

TIA

संपादित करें: स्वीकार किए जाते हैं जवाब Unixy प्लेटफार्मों (जब ReadLine मॉड्यूल उपलब्ध है) के तहत काम करता है, लेकिन किसी को भी जानता है Windows के तहत इस काम करने के लिए कैसे, यह बहुत सराहना की जाएगी!

उत्तर

8

हो सकता है कि कुछ इस तरह चाल करना होगा:

#!/usr/bin/env python2.6 

from __future__ import print_function 

import readline 
import threading 

PROMPT = '> ' 

def interrupt(): 
    print() # Don't want to end up on the same line the user is typing on. 
    print('Interrupting cow -- moo!') 
    print(PROMPT, readline.get_line_buffer(), sep='', end='') 

def cli(): 
    while True: 
     cli = str(raw_input(PROMPT)) 

if __name__ == '__main__': 
    threading.Thread(target=cli).start() 
    threading.Timer(2, interrupt).start() 

मुझे नहीं लगता कि कि stdin धागा सुरक्षित है, तो आप (दखल धागा करने के लिए पात्रों को खोने उपयोगकर्ता करना होगा कि अंत कर सकते हैं interrupt के अंत में पुनः टाइप करें)। मैं time.sleep कॉल के साथ interrupt समय की मात्रा को बढ़ा-चढ़ा। readline.get_line_buffer कॉल खोए गए पात्रों को प्रदर्शित नहीं करेगा, इसलिए यह सब ठीक हो जाता है।

ध्यान दें कि खुद stdout सुरक्षित थ्रेड नहीं है, इसलिए यदि आप निष्पादन के कई दखल धागे मिल गया है, यह अभी भी सकल देख खत्म कर सकते हैं।

+0

धन्यवाद, readline.get_line_buffer() एक अच्छी शुरुआत है। अगर किसी के पास विंडोज़ में यह काम करने के बारे में कोई सुझाव है (जिसमें कोई रीडलाइन मॉड्यूल नहीं है), तो मुझे बताएं। – andy

+0

क्या यह सिगविन में काम करता है, शायद? – cdleary

-1

यह एक गैर-जवाब की तरह है, लेकिन मैं IPython के कोड को देखने को देखने के लिए कि वे कैसे कर रहे हैं।

-1

मुझे लगता है कि आप 2 बुनियादी विकल्प हैं:

  1. अपने उत्पादन सिंक्रनाइज़ (अर्थात ब्लॉक जब तक यह वापस आता है)
  2. अलग अपने इनपुट और अपने (asyncronous) उत्पादन, शायद दो अलग-अलग कॉलम में।
5

तुम क्यों raw_input() उपयोग कर अपने खुद आरईपीएल लिख रहे हैं? क्या आपने cmd.Cmd कक्षा देखी है? संपादित करें: मैं सिर्फ sclapp पुस्तकालय है, जो भी उपयोगी हो सकता है पाया।

नोट: cmd.Cmd वर्ग (और sclapp) या सीधे अपने मूल लक्ष्य समर्थन नहीं कर सकते हो सकता है; आपको उस सुविधा को प्रदान करने के लिए इसे उपclass करना होगा और इसे संशोधित करना पड़ सकता है।

+0

cmd.Cmd बहुत बढ़िया दिखता है और मुझे शायद इसका उपयोग शुरू करना चाहिए। हालांकि, ऐसा लगता है कि यह मेरा मूल लक्ष्य, कोई सुझाव नहीं है? – andy

+3

स्क्लेप निष्क्रिय होना प्रतीत होता है। प्रदान किया गया लिंक काम नहीं करता है, और मुझे अपना नया घर नहीं मिला है। –

0

कोड मॉड्यूल में देखें, यह आपको पाइथन कोड (शर्मनाक प्लग) की व्याख्या करने के लिए ऑब्जेक्ट्स बनाने देता है https://github.com/iridium172/PyTerm आपको कच्चे कीबोर्ड इनपुट को संभालने वाले इंटरैक्टिव कमांड लाइन प्रोग्राम बनाने देता है (जैसे^सी कीबोर्ड इंटरप्ट को बढ़ाएगा)।

2

रन इस:

python -m twisted.conch.stdio 

आप मिल जाएगा एक अच्छा, रंग, आरईपीएल, async धागे का उपयोग किए बिना। जब आप प्रॉम्प्ट में टाइप करते हैं, तो ईवेंट लूप चल रहा है।

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

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