2012-07-29 13 views
7

मैं एक ऐसा प्रोग्राम बनाने की कोशिश कर रहा हूं जो दृश्य विंडो (कंसोल) और कमांड लाइन दोनों लॉन्च करे। दृश्य विंडो में, यह स्थिर अद्यतन दिखाएगा, जबकि कमांड लाइन विंडो दृश्य विंडो को प्रभावित करने वाले आदेशों को स्वीकार करने के लिए raw_input() का उपयोग करेगी। मैं इसके लिए धागे का उपयोग करने के बारे में सोच रहा हूं, लेकिन मुझे नहीं पता कि एक नई कंसोल विंडो में थ्रेड लॉन्च कैसे करें। मुझे यह कैसे करना है?एक नई कंसोल विंडो में एक पायथन थ्रेड खोलना

+3

सुनिश्चित नहीं हैं कि अगर आप कर सकते हैं सब पर है, लेकिन वहाँ प्लेटफार्मों के बीच भारी मतभेद हैं। सबसे महत्वपूर्ण बात यह है कि विंडोज कंसोल यूनिक्स टर्मिनल से अलग है। आप किस मंच पर हैं? –

+0

मैं विंडोज और यूनिक्स/लिनक्स/मैक दोनों पर इसे कैसे करना चाहता हूं, और पोर्टेबल होने के लिए sys.platform का उपयोग करें। – elijaheac

+0

अद्यतन कहां लिखने वाला प्रोग्राम कहां से आता है। क्या आप इसे नियंत्रित कर सकते हैं? – jfs

उत्तर

4

कंसोल या टर्मिनल विंडो का उपयोग करने के बजाय, अपनी समस्या का पुन: परीक्षण करें। आप जो करने की कोशिश कर रहे हैं वह एक जीयूआई बना रहा है। Wx और Tkinter समेत कई क्रॉस-प्लेटफ़ॉर्म टूलकिट हैं जिनमें विगेट्स वही हैं जो आप चाहते हैं। आउटपुट के लिए एक टेक्स्ट बॉक्स और कीबोर्ड इनपुट पढ़ने के लिए एक एंट्री विजेट। इसके अलावा आप उन्हें शीर्षक, सहायता, खुले/सहेज/बंद आदि के साथ एक अच्छे फ्रेम में लपेट सकते हैं।

9

मैं @ स्टार्क से सहमत हूं कि एक जीयूआई रास्ता है।

चित्रण के लिए शुद्ध रूप से यहां एक अनुशंसित गैर-GUI तरीका है जो दिखाता है कि थ्रेड, उपप्रोसेस और आईपीसी के रूप में नामित पाइप का उपयोग करके इसे कैसे किया जाए।

  • entry.py:

    दो लिपियों रहे हैं एक उपयोगकर्ता से आदेश स्वीकार करते हैं, आदेश के साथ कुछ करना है, यह कमांड लाइन पर दिया नामित पाइप को पारित:

    #!/usr/bin/env python 
    import sys 
    
    print 'entry console' 
    with open(sys.argv[1], 'w') as file: 
        for command in iter(lambda: raw_input('>>> '), ''): 
         print ''.join(reversed(command)) # do something with it 
         print >>file, command # pass the command to view window 
         file.flush() 
    
  • view.py: एंट्री कंसोल लॉन्च करें, थ्रेड में निरंतर अपडेट प्रिंट करें, नामित पाइप से इनपुट स्वीकार करें और इसे अपडेट थ्रेड पर पास करें:

    #!/usr/bin/env python 
    import os 
    import subprocess 
    import sys 
    import tempfile 
    from Queue import Queue, Empty 
    from threading import Thread 
    
    def launch_entry_console(named_pipe): 
        if os.name == 'nt': # or use sys.platform for more specific names 
         console = ['cmd.exe', '/c'] # or something 
        else: 
         console = ['xterm', '-e'] # specify your favorite terminal 
                # emulator here 
    
        cmd = ['python', 'entry.py', named_pipe] 
        return subprocess.Popen(console + cmd) 
    
    def print_updates(queue): 
        value = queue.get() # wait until value is available 
    
        msg = "" 
        while True: 
         for c in "/-\|": 
          minwidth = len(msg) # make sure previous output is overwritten 
          msg = "\r%s %s" % (c, value) 
          sys.stdout.write(msg.ljust(minwidth)) 
          sys.stdout.flush() 
    
          try: 
           value = queue.get(timeout=.1) # update value 
           print 
          except Empty: 
           pass 
    
    print 'view console' 
    # launch updates thread 
    q = Queue(maxsize=1) # use queue to communicate with the thread 
    t = Thread(target=print_updates, args=(q,)) 
    t.daemon = True # die with the program 
    t.start() 
    
    # create named pipe to communicate with the entry console 
    dirname = tempfile.mkdtemp() 
    named_pipe = os.path.join(dirname, 'named_pipe') 
    os.mkfifo(named_pipe) #note: there should be an analog on Windows 
    try: 
        p = launch_entry_console(named_pipe) 
        # accept input from the entry console 
        with open(named_pipe) as file: 
         for line in iter(file.readline, ''): 
          # pass it to 'print_updates' thread 
          q.put(line.strip()) # block until the value is retrieved 
        p.wait() 
    finally: 
        os.unlink(named_pipe) 
        os.rmdir(dirname) 
    

आजमाएँ, चलाएँ:

$ python view.py 
+0

मुझे लगता है कि मैंने आपके कोड की जानकारी समझ ली है। तो सुनिश्चित करने के लिए, जब आपने subprocess 'p = launch_entry_console (name_pipe) 'लॉन्च किया था और फिर फ़ाइल के रूप में' open (name_pipe) के साथ 'फ़ाइल को पढ़ना शुरू कर दिया था, तो क्या यह पढ़ाई पृष्ठभूमि में चल रही है? जैसा कि, मैं पहले से ही इस योजना का उपयोग कर सकता हूं अगर मैं 'पी' को समाप्त करना चाहता हूं, जब एक निश्चित पाठ 'स्टॉप' खुली पाइप के साथ पढ़ा जाता है। –

+0

हां, नामित पाइप से पढ़ रहे समय 'पी' प्रक्रिया चल रही है। – jfs

+0

विंडोज़ में, आप 'console = [" cmd.exe ","/c "," start "]' 'का उपयोग करेंगे। 'स्टार्ट' विंडोज को एक नई विंडो खोलता है। साथ ही, मैं COMSPEC पर्यावरण चर का संदर्भ देना चाहता हूं और 'कंसोल = [os.en वातावरण.get ("COMSPEC", "CMD.EXE"), "/ C", "START"] के रूप में पूंजी अक्षरों का उपयोग करना पसंद करता हूं, लेकिन, यह सिर्फ मेरी शैली है। बेशक, मैं मानता हूं कि जीयूआई इन सब से बेहतर समाधान होगा। – wecsam

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