Python: включение wx.py.shell.Shell в отдельный процесс

1

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

EDIT:

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

  • 0
    Не могли бы вы объяснить свой вопрос больше?
  • 0
    Когда вы обычно создаете wx.py.shell.Shell, он отправляет ваши команды текущему процессу Python, на котором выполняется GUI. Я хочу, чтобы команды перешли к другому процессу, который я создал.
Теги:
multiprocessing
wxpython

2 ответа

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

  • 0
    Я не понимаю Мне нужна оболочка, в которой пользователь может вводить команды Python, и они отправляются во вторичный процесс. Это то, что я получаю здесь? Потому что я не понимаю, что такое CodeStr.
  • 0
    codeStr был примером, показывающим, как создать объект кода и выполнить его удаленно в оболочке. Если все, что вам нужно, это выполнить команды из оболочки в другом процессе, то вам нужно создать собственный класс интерпретатора, унаследованный от класса Interpreter (находится в файлеinterter.py в пакете py). В вашем пользовательском интерпретаторе перезапишите метод runource, чтобы он использовал аргумент «source» для создания объекта кода, а затем выполняет этот объект кода в отдельном процессе. Теперь у вас есть настроенный класс переводчика. sh = Shell (frm, InterpClass = yourInterpreter) Это должно сделать это.
Показать ещё 1 комментарий
0

Вы можете создать 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, которые затем должны быть прочитаны в родительском процессе, который будет выполнен.

  • 0
    Пожалуйста, более подробно о том, как это позволяет мне создать оболочку, которая контролирует мой вторичный процесс.
  • 0
    В вашем примере вторичный процесс создает Shell, объект wx. Как вы думаете, возможно ли создать объект wx из вторичного процесса, даже если основной процесс создает wx.App и все другие объекты wx?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню