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中执行代码对象
从 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.runco​​de(代码)

注意: 由于一些酸洗问题,我从第一张海报中窃取的 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 插入单独的进程的主要内容,如果未能解决你的问题,请参考以下文章

怎么将python中的数组全部打印出来array

python如何将字符转换为数字

python 将一个List分解

如何将python三个方法输出在同一行

在python中,如何将一个字符串中的小写字母全部转换为大写?

python中,如何将字符串中的多个不等量空格改为改为逗号分隔?