bien aquí está otra prueba, que también lee todos los resultados y errores, en un hilo separado y se comunica a través de Queue. Sé que no es perfecto (por ejemplo, el comando con salida diferida no funcionará y la salida entrará en el siguiente servidor, por ejemplo tryr sleep 1; date) y replicar bash completo no trivial, pero para algunos comandos probé parece funcionar bien
En cuanto a la API de wx.py.shell, simplemente implementé el método que la clase Shell llamaba para el intérprete, si va a través del código fuente de Shell lo entenderá. básicamente
- empuje es donde entra el comando de usuario se envía al intérprete
- getAutoCompleteKeys devuelve claves la que el usuario puede de usuario para completar comandos de automóviles, por ejemplo, pestaña clave
getAutoCompleteList lista de devolución de juego orden dada texto
getCallTip "especificación argumento Pantalla y cadena de documentación en una ventana emergente.por lo que para fiesta podemos mostrar la página hombre :)
aquí está el código fuente
import threading
import Queue
import time
import wx
import wx.py
from subprocess import Popen, PIPE
class BashProcessThread(threading.Thread):
def __init__(self, readlineFunc):
threading.Thread.__init__(self)
self.readlineFunc = readlineFunc
self.outputQueue = Queue.Queue()
self.setDaemon(True)
def run(self):
while True:
line = self.readlineFunc()
self.outputQueue.put(line)
def getOutput(self):
""" called from other thread """
lines = []
while True:
try:
line = self.outputQueue.get_nowait()
lines.append(line)
except Queue.Empty:
break
return ''.join(lines)
class MyInterpretor(object):
def __init__(self, locals, rawin, stdin, stdout, stderr):
self.introText = "Welcome to stackoverflow bash shell"
self.locals = locals
self.revision = 1.0
self.rawin = rawin
self.stdin = stdin
self.stdout = stdout
self.stderr = stderr
self.more = False
# bash process
self.bp = Popen('bash', shell=False, stdout=PIPE, stdin=PIPE, stderr=PIPE)
# start output grab thread
self.outputThread = BashProcessThread(self.bp.stdout.readline)
self.outputThread.start()
# start err grab thread
self.errorThread = BashProcessThread(self.bp.stderr.readline)
self.errorThread.start()
def getAutoCompleteKeys(self):
return [ord('\t')]
def getAutoCompleteList(self, *args, **kwargs):
return []
def getCallTip(self, command):
return ""
def push(self, command):
command = command.strip()
if not command: return
self.bp.stdin.write(command+"\n")
# wait a bit
time.sleep(.1)
# print output
self.stdout.write(self.outputThread.getOutput())
# print error
self.stderr.write(self.errorThread.getOutput())
app = wx.PySimpleApp()
frame = wx.py.shell.ShellFrame(InterpClass=MyInterpretor)
frame.Show()
app.SetTopWindow(frame)
app.MainLoop()
¿Qué es un "REPL"? –
A Read-Eval-Print-Loop –