Я хотел бы создать оболочку, которая будет управлять отдельным процессом, который я создал с помощью модуля многопроцессорности. Возможное? Как?
EDIT:
Я уже получил способ отправки команд второму процессу: я создал 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)
Примечание: КодStr I, украденный с первого плаката, может не работать здесь из-за некоторых проблем травления. Но дело в том, что вы можете выполнить свой собственный кодStr удаленно в оболочке.
Вы можете создать 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 Docs параметры конструктора указаны как
__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
, которые затем должны быть прочитаны в родительском процессе, который будет выполнен.