मैं एक ऐसा प्रोग्राम बनाने की कोशिश कर रहा हूं जो दृश्य विंडो (कंसोल) और कमांड लाइन दोनों लॉन्च करे। दृश्य विंडो में, यह स्थिर अद्यतन दिखाएगा, जबकि कमांड लाइन विंडो दृश्य विंडो को प्रभावित करने वाले आदेशों को स्वीकार करने के लिए raw_input()
का उपयोग करेगी। मैं इसके लिए धागे का उपयोग करने के बारे में सोच रहा हूं, लेकिन मुझे नहीं पता कि एक नई कंसोल विंडो में थ्रेड लॉन्च कैसे करें। मुझे यह कैसे करना है?एक नई कंसोल विंडो में एक पायथन थ्रेड खोलना
उत्तर
कंसोल या टर्मिनल विंडो का उपयोग करने के बजाय, अपनी समस्या का पुन: परीक्षण करें। आप जो करने की कोशिश कर रहे हैं वह एक जीयूआई बना रहा है। Wx और Tkinter समेत कई क्रॉस-प्लेटफ़ॉर्म टूलकिट हैं जिनमें विगेट्स वही हैं जो आप चाहते हैं। आउटपुट के लिए एक टेक्स्ट बॉक्स और कीबोर्ड इनपुट पढ़ने के लिए एक एंट्री विजेट। इसके अलावा आप उन्हें शीर्षक, सहायता, खुले/सहेज/बंद आदि के साथ एक अच्छे फ्रेम में लपेट सकते हैं।
मैं @ स्टार्क से सहमत हूं कि एक जीयूआई रास्ता है।
चित्रण के लिए शुद्ध रूप से यहां एक अनुशंसित गैर-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
मुझे लगता है कि मैंने आपके कोड की जानकारी समझ ली है। तो सुनिश्चित करने के लिए, जब आपने subprocess 'p = launch_entry_console (name_pipe) 'लॉन्च किया था और फिर फ़ाइल के रूप में' open (name_pipe) के साथ 'फ़ाइल को पढ़ना शुरू कर दिया था, तो क्या यह पढ़ाई पृष्ठभूमि में चल रही है? जैसा कि, मैं पहले से ही इस योजना का उपयोग कर सकता हूं अगर मैं 'पी' को समाप्त करना चाहता हूं, जब एक निश्चित पाठ 'स्टॉप' खुली पाइप के साथ पढ़ा जाता है। –
हां, नामित पाइप से पढ़ रहे समय 'पी' प्रक्रिया चल रही है। – jfs
विंडोज़ में, आप 'console = [" cmd.exe ","/c "," start "]' 'का उपयोग करेंगे। 'स्टार्ट' विंडोज को एक नई विंडो खोलता है। साथ ही, मैं COMSPEC पर्यावरण चर का संदर्भ देना चाहता हूं और 'कंसोल = [os.en वातावरण.get ("COMSPEC", "CMD.EXE"), "/ C", "START"] के रूप में पूंजी अक्षरों का उपयोग करना पसंद करता हूं, लेकिन, यह सिर्फ मेरी शैली है। बेशक, मैं मानता हूं कि जीयूआई इन सब से बेहतर समाधान होगा। – wecsam
- 1. चांदी की रोशनी में एक नई विंडो खोलना
- 2. एक नई विंडो में rails.vim संबंधित फ़ाइल खोलना
- 3. एक पूर्णस्क्रीन ओपनजीएल विंडो खोलना
- 4. एक पूर्ण विंडो में सहायता खोलना
- 5. एक नई विंडो
- 6. एक नई विंडो
- 7. लक्ष्य के लिए एचटीएमएल में नई विंडो खोलना = "_ खाली"
- 8. एक मॉडल पॉप अप विंडो खोलना
- 9. एक एचटीएमएल 5 फॉर्म पोस्ट करना, रीफ्रेश करना या एक नई विंडो खोलना
- 10. .NET में विंडोज प्रपत्रों में एक नई विंडो कैसे खोलें?
- 11. फॉर्म पर एक नई विंडो कैसे खोलें
- 12. नया ओएसएक्स उपयोगकर्ता: वर्तमान स्थान में एक नई टर्मिनल विंडो खोलना (?)
- 13. विंडोज़ फॉर्म के साथ एक्सएनए - नई विंडो खोलना
- 14. डेल्फी कंसोल ऐप में stdin/stdout पर एक टीस्ट्रीम खोलना
- 15. मीडियाविकी एक नई विंडो में बाहरी लिंक खोलें
- 16. नई विंडो में छवि खोलें
- 17. मैकवीम पर एक नई विंडो के बजाय टर्मिनल से एक टैब में एक नई फ़ाइल कैसे खोलूं?
- 18. क्या वेबपृष्ठ से एक नई Lync वार्तालाप खोलना संभव है?
- 19. एक नई विंडो में vim में एक नई फ़ाइल कैसे खोलें
- 20. बुकमार्कलेट नई विंडो में
- 21. एक नए टैब में एक लिंक खोलना
- 22. कंसोल विंडो
- 23. नामित फ़ाइल के साथ एक एक्सप्लोरर विंडो खोलना
- 24. एमवीसी में एक एचटीएमएल एक्शन लिंक पर क्लिक करके एक नई पॉपअप विंडो कैसे खोलें?
- 25. कंसोल विंडो
- 26. नई विंडो में Google मानचित्र खोलें।
- 27. नई विंडो पर खुली प्रतिक्रिया
- 28. सी # कंसोल अनुप्रयोग में कंसोल विंडो छुपाएं
- 29. IE8 जब एक रीडायरेक्ट के बाद एक नई विंडो खोलने
- 30. एक नई विंडो खोलने के बिना एक ट्वीट बटन बनाना
सुनिश्चित नहीं हैं कि अगर आप कर सकते हैं सब पर है, लेकिन वहाँ प्लेटफार्मों के बीच भारी मतभेद हैं। सबसे महत्वपूर्ण बात यह है कि विंडोज कंसोल यूनिक्स टर्मिनल से अलग है। आप किस मंच पर हैं? –
मैं विंडोज और यूनिक्स/लिनक्स/मैक दोनों पर इसे कैसे करना चाहता हूं, और पोर्टेबल होने के लिए sys.platform का उपयोग करें। – elijaheac
अद्यतन कहां लिखने वाला प्रोग्राम कहां से आता है। क्या आप इसे नियंत्रित कर सकते हैं? – jfs