Python:将 wx.py.shell.Shell 插入单独的进程
Posted
技术标签:
【中文标题】Python:将 wx.py.shell.Shell 插入单独的进程【英文标题】:Python: Plugging wx.py.shell.Shell into a separate process 【发布时间】:2010-10-26 06:58:46 【问题描述】:我想创建一个 shell 来控制我使用多处理模块创建的一个单独的进程。可能的?怎么样?
编辑:
我已经实现了一种向辅助进程发送命令的方法:我在该进程中创建了一个code.InteractiveConsole
,并将其附加到一个输入队列和一个输出队列,这样我就可以从我的主进程命令控制台。但我希望它在一个 shell 中,可能是 wx.py.shell.Shell
,所以程序的用户可以使用它。
【问题讨论】:
你能解释一下你的问题吗? 当您通常创建 wx.py.shell.Shell 时,它会将您的命令发送到运行 GUI 的 Python 的当前进程。我希望命令转到我创建的不同进程。 【参考方案1】:您可以创建一个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 中,构造参数给出为
__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
,然后必须在要执行的父进程中读取这些命令。
【讨论】:
请详细说明这如何让我创建一个控制我的辅助进程的外壳。 在您的示例中,辅助进程正在创建 Shell,即 wx 对象。即使主进程创建了 wx.App 和所有其他 wx 对象,您认为可以从辅助进程创建 wx 对象吗?【参考方案2】:-
首先创建外壳
通过将 shell 的本地变量设为空来将 shell 与您的应用程序分离
创建您的代码字符串
编译代码串,得到代码对象
在shell中执行代码对象
注意: 由于一些酸洗问题,我从第一张海报中窃取的 codeStr 可能无法在此处使用。但重点是您可以在 shell 中远程执行自己的 codeStr。
【讨论】:
我不明白。我想要的是一个外壳,用户可以在其中输入 Python 命令,然后将它们发送到辅助进程。这就是我要来的吗?因为我不明白那个 codeStr 的东西。 codeStr 是一个示例,展示了如何创建代码对象并在 shell 中远程执行它。如果您只需要在另一个进程中从 shell 执行命令,那么您需要创建一个继承自解释器类的自定义解释器类(位于 py 包中的解释器.py 中)。在您的自定义解释器中覆盖 runsource 方法,以便它使用“source”参数创建代码对象,然后在单独的进程中执行此代码对象。现在你有一个定制的解释器类。 sh = Shell(frm, InterpClass=yourInterpreter) 这应该可以。 我还是一头雾水。我浏览了interpreter.py 和code.py。你确定我只需要覆盖runsource
吗? runcode
呢?以上是关于Python:将 wx.py.shell.Shell 插入单独的进程的主要内容,如果未能解决你的问题,请参考以下文章