我想创建一个外壳来控制我使用多处理模块创建的单独进程。可能的?如何?
编辑:
我已经实现了一种向辅助进程发送命令的方法:我code.InteractiveConsole在该进程中创建了一个,并将其附加到一个输入队列和一个输出队列,这样我就可以从我的主进程命令控制台。但我希望它在一个外壳中,可能是一个wx.py.shell.Shell,所以程序的用户可以使用它。
我想创建一个外壳来控制我使用多处理模块创建的单独进程。可能的?如何?
编辑:
我已经实现了一种向辅助进程发送命令的方法:我code.InteractiveConsole在该进程中创建了一个,并将其附加到一个输入队列和一个输出队列,这样我就可以从我的主进程命令控制台。但我希望它在一个外壳中,可能是一个wx.py.shell.Shell,所以程序的用户可以使用它。
从 wx.py.shell 导入外壳
frm = wx.Frame(无)
sh = 壳牌(frm)
frm.Show()
sh.interp.locals = {}
codeStr = """
从多处理导入进程,队列
定义 f(q):
q.put([42, 无, '你好'])
q = 队列()
p = 进程(目标=f,args=(q,))
p.start()
print q.get() # 打印 "[42, None, 'hello']"
p.join()
"""
代码 = 编译(codeStr,'','exec')
sh.interp.runcode(代码)
注意:由于一些酸洗问题,我从第一张海报中窃取的 codeStr 可能无法在此处使用。但关键是您可以在 shell 中远程执行自己的 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可能是一个局部变量字典,你可以将它传递给 shell。所以,我会尝试以下方法:
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()
在 shell 内部,您应该能够将您的命令放入cmd_queue其中,然后在要执行的父进程中读取这些命令。