Вопрос

Я хотел бы создать оболочку, которая будет управлять отдельным процессом, который я создал с помощью модуля многопроцессорности.Возможный?Как?

РЕДАКТИРОВАТЬ:

Я уже нашел способ отправлять команды вторичному процессу:Я создал code.InteractiveConsole в этом процессе и прикрепил его к очереди ввода и очереди вывода, чтобы я мог управлять консолью из основного процесса.Но я хочу, чтобы это было в оболочке, возможно, wx.py.shell.Shell, чтобы пользователь программы мог использовать его.

Это было полезно?

Решение

  1. Сначала создайте оболочку
  2. Отделите оболочку от вашего приложения, сделав ее локальные переменные пустыми.
  3. Создайте свою строку кода
  4. Скомпилируйте строку кода и получите объект кода.
  5. Выполнить объект кода в оболочке
    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 которые затем необходимо прочитать в родительском процессе для выполнения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top