Python: Plugging wx.py.shell.Shell en un proceso independiente
-
21-08-2019 - |
Pregunta
Me gustaría para crear una concha que controlará un proceso separado que creé con el módulo de multiprocesamiento. ¿Posible? ¿Cómo?
EDIT:
Ya han logrado una forma de enviar comandos al proceso secundario: He creado un code.InteractiveConsole
en ese proceso, y unido a una cola de entrada y una cola de salida, por lo que puede comandar la consola de mi proceso principal. Pero lo quiero en una concha, probablemente un wx.py.shell.Shell
, por lo que un usuario del programa podría utilizarlo.
Solución
- En primer lugar crear la cáscara
- desacoplar la concha de su aplicación, haciendo que sus vecinos vacío
- Crea tu cadena de código
- Compilar la cadena de código y obtener un objeto de código
- Ejecutar el objeto de código en la cáscara
from wx.py.shell import Shell frm = wx.Frame(None) sh = Shell(frm) frm.Show() sh.interp.locals = {} codeStr = """ from multiprocessing import Process, Queue def f(q): q.put([42, None, 'hello']) q = Queue() p = Process(target=f, args=(q,)) p.start() print q.get() # prints "[42, None, 'hello']" p.join() """ code = compile(codeStr, '', 'exec') sh.interp.runcode(code)
Nota: El codeStr me robó el primer cartel no puede trabajar aquí debido a algunos problemas de decapado. Pero el punto es que puede ejecutar su propio codeStr forma remota en una cáscara.
Otros consejos
Se puede crear un Queue
del cual se establece el proceso separado. Desde el Python Docs :
from multiprocessing import Process, Queue
def f(q):
q.put([42, None, 'hello'])
if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print q.get() # prints "[42, None, 'hello']"
p.join()
Ejemplo: En el wx.py.shell.Shell Docs los parámetros constructur se dan como
__init__(self, parent, id, pos, size, style, introText, locals,
InterpClass, startupScript, execStartupScript, *args, **kwds)
No he probado, pero locals
podría ser un diccionario de variables locales, que se pueden pasar a la cáscara. Por lo tanto, me gustaría probar el siguiente:
def f(cmd_queue):
shell = wx.py.shell.Shell(parent, id, pos, size, style, introText, locals(),
...)
q = Queue()
p = Process(target=f, args=(q,))
p.start()
Dentro de la cáscara, a continuación, debe ser capaz de poner sus órdenes en cmd_queue
que tienen entonces que ser entendida en el proceso padre a ser ejecutado.