Питон:Подключение wx.py.shell.Shell в отдельный процесс
-
21-08-2019 - |
Вопрос
Я хотел бы создать оболочку, которая будет управлять отдельным процессом, который я создал с помощью модуля многопроцессорности.Возможный?Как?
РЕДАКТИРОВАТЬ:
Я уже нашел способ отправлять команды вторичному процессу:Я создал code.InteractiveConsole
в этом процессе и прикрепил его к очереди ввода и очереди вывода, чтобы я мог управлять консолью из основного процесса.Но я хочу, чтобы это было в оболочке, возможно, wx.py.shell.Shell
, чтобы пользователь программы мог использовать его.
Решение
- Сначала создайте оболочку
- Отделите оболочку от вашего приложения, сделав ее локальные переменные пустыми.
- Создайте свою строку кода
- Скомпилируйте строку кода и получите объект кода.
- Выполнить объект кода в оболочке
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)
Примечание:CodeStr, который я украл из первого постера, может здесь не работать из-за некоторых проблем с травлением.Но дело в том, что вы можете выполнить свой собственный codeStr удаленно в оболочке.
Другие советы
Вы можете создать Queue
который вы передаете в отдельный процесс.Из Документы Python:
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()
ПРИМЕР: в Документация wx.py.shell.Shell параметры конструктора задаются как
__init__(self, parent, id, pos, size, style, introText, locals,
InterpClass, startupScript, execStartupScript, *args, **kwds)
Я не пробовал, но locals
может быть словарем локальных переменных, которые вы можете передать в оболочку.Итак, я бы попробовал следующее:
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()
Внутри оболочки вы сможете помещать свои команды в cmd_queue
которые затем необходимо прочитать в родительском процессе для выполнения.