Python: включение wx.py.shell.Shell в отдельный процесс - PullRequest
1 голос
/ 14 мая 2009

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

EDIT:

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

Ответы [ 2 ]

1 голос
/ 21 мая 2009
  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 удаленно в оболочке.

0 голосов
/ 15 мая 2009

Вы можете создать Queue, который вы передадите отдельному процессу. Из Python Docs :

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 параметры constructur задаются как

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

...