Ich stimme @stark zu, eine GUI ist der Weg.
Rein zur Veranschaulichung ist hier eine nicht empfohlene Nicht-GUI Weise, die zeigt, wie man es mit einem Thread, einem Unterprozess und einer Named Pipe als IPC macht.
Es gibt zwei Skripte:
-
entry.py
:Befehle von einem Benutzer akzeptieren, etwas mit dem Befehl tun, ihn an die benannte Pipe übergeben, die in der Befehlszeile angegeben ist:#!/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
:Starte die Eingabekonsole, drucke ständige Updates in einem Thread, akzeptiere Eingaben von der Named Pipe und übergebe sie an den Updates-Thread:#!/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)
Führen Sie zum Ausprobieren Folgendes aus:
$ python view.py
Anstatt eine Konsole oder ein Terminalfenster zu verwenden, untersuchen Sie Ihr Problem erneut. Was Sie versuchen, ist eine GUI zu erstellen. Es gibt eine Reihe von plattformübergreifenden Toolkits, darunter Wx und Tkinter, die Widgets enthalten, um genau das zu tun, was Sie wollen. Ein Textfeld für die Ausgabe und ein Eingabe-Widget zum Lesen von Tastatureingaben. Außerdem können Sie sie in einen schönen Rahmen mit Titeln, Hilfe, Öffnen/Speichern/Schließen usw. packen.