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

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

ИЗМЕНИТЬ:

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


person Ram Rachum    schedule 14.05.2009    source источник
comment
Не могли бы вы объяснить свой вопрос подробнее?   -  person kcwu    schedule 14.05.2009
comment
Когда вы обычно создаете wx.py.shell.Shell, он отправляет ваши команды текущему процессу Python, который запускает графический интерфейс. Я хочу, чтобы команды перешли к другому процессу, который я создал.   -  person Ram Rachum    schedule 14.05.2009


Ответы (2)


  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 удаленно в оболочке.

person user110476    schedule 21.05.2009
comment
Я не понимаю. Что мне нужно, так это оболочка, в которой пользователь может вводить команды Python, и они отправляются во вторичный процесс. Это то, что я получаю здесь? Потому что я не понимаю эту штуку codeStr. - person Ram Rachum; 22.05.2009
comment
codeStr был примером, показывающим, как создать объект кода и выполнить его удаленно в оболочке. Если все, что вам нужно, это выполнение команд из оболочки в другом процессе, вам нужно создать собственный класс интерпретатора, наследующий от класса Interpreter (находится в файлеterpreter.py в пакете py). В вашем пользовательском интерпретаторе перезапишите метод источника выполнения, чтобы он использовал исходный аргумент для создания объекта кода, а затем выполнял этот объект кода в отдельном процессе. Теперь у вас есть настраиваемый класс интерпретатора. sh = Shell(frm, InterpClass=yourInterpreter) Это должно сработать. - person user110476; 22.05.2009
comment
Я все еще в замешательстве. Я просмотрел интерпретатор.py и code.py. Вы уверены, что мне нужно перезаписать только runsource? А как насчет runcode? - person Ram Rachum; 24.05.2009

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

person wr.    schedule 14.05.2009
comment
Пожалуйста, уточните, как это позволяет мне создать оболочку, которая управляет моим вторичным процессом. - person Ram Rachum; 15.05.2009
comment
В вашем примере вторичный процесс создает оболочку, объект wx. Как вы думаете, возможно ли создать объект wx из вторичного процесса, даже если основной процесс создает wx.App и все остальные объекты wx? - person Ram Rachum; 15.05.2009