在子流程中执行python脚本-带有图形

在子流程中执行python脚本-带有图形,python,wxpython,Python,Wxpython,我看过很多关于在子进程或线程中运行代码的内容,使用多处理和线程模块非常简单。然而,在GUI中这样做会增加额外的复杂性 据我所知,如果您尝试从多个线程(或进程)操作GUI类,GUI类不喜欢这样做。解决方法是将数据从创建它的任何线程发送到负责图形的线程,然后在那里进行渲染 不幸的是,对于我想到的场景,这不是一个选项:我创建的gui允许用户编写自己的绘图代码,然后执行。这意味着我无法控制他们到底是如何策划的,我也不想拥有它。(更新:这些绘图显示在单独的窗口中,不需要嵌入主GUI中的任何位置。我希望它们

我看过很多关于在子进程或线程中运行代码的内容,使用
多处理
线程
模块非常简单。然而,在GUI中这样做会增加额外的复杂性

据我所知,如果您尝试从多个线程(或进程)操作GUI类,GUI类不喜欢这样做。解决方法是将数据从创建它的任何线程发送到负责图形的线程,然后在那里进行渲染

不幸的是,对于我想到的场景,这不是一个选项:我创建的gui允许用户编写自己的绘图代码,然后执行。这意味着我无法控制他们到底是如何策划的,我也不想拥有它。(更新:这些绘图显示在单独的窗口中,不需要嵌入主GUI中的任何位置。我希望它们与主GUI分离,而不共享任何底层图形库堆栈。)

所以我现在想知道的是

在一个全新的解释器实例中,是否有一些干净(ish)的方式来执行一个python代码字符串,并将其与窗口系统联系起来


针对这些评论:

当前应用程序的设置如下:一个简单的python脚本加载一个wxpythonGUI(一个wx.App)。使用此gui,用户可以设置一个模拟,其中一部分涉及用普通python创建一个脚本来运行模拟并对结果进行后期处理(通常包括绘制图并显示)。目前,我只是通过对脚本代码调用exec()来实现这一点。这可以正常工作,但gui在模拟运行时冻结。我已经尝试在子流程中运行嵌入式脚本,它也可以正常工作,直到您尝试显示创建的图形为止(通常使用matplotlib的show()。此时,wxPython、wx、gtk等堆栈深处的一些库开始抱怨,因为您无法从多个线程对其进行操作。 我想要的设置大致相同,但我不希望嵌入式脚本与主应用程序共享GUI,而是希望它在自己的环境中显示图形

我想澄清一下:

这是一个关于“如何在单个wxpython gui中执行多线程/多处理”甚至“如何在单个wxpython gui中执行多线程/多处理”的问题。问题是如何从加载全新gui的gui启动脚本。如何让窗口管理器将此脚本视为一个完全独立的应用程序


最简单的方法是在某个临时文件夹中生成它,然后对python解释器进行非阻塞调用,但这会使通信更加困难,并且很难知道何时可以再次删除临时文件。我希望有一种更干净、更动态的方法来实现这一点。

在Windows上,您可以使用另一个进程中的父窗口创建窗口,然后继续绘制。 请参阅hWndParent参数以查看

如果wxWindows支持显式地获取/设置该值,那么您就可以开始了。 根据您的平台,在任何windows系统中都可能出现类似的情况


因此,只要让用户能够找到应用程序窗口的句柄,他们就可以在自己的进程中运行时,选择在应用程序中嵌入的视图中绘图。

在Windows上,您可以使用另一个进程的父窗口创建窗口,并绘制到该窗口。 请参阅hWndParent参数以查看

如果wxWindows支持显式地获取/设置该值,那么您就可以开始了。 根据您的平台,在任何windows系统中都可能出现类似的情况


因此,只要让用户能够找到应用程序窗口的句柄,他们就可以选择在自己的进程中运行时,绘制嵌入到应用程序中的视图。

我不太了解wx,我使用jython(用java实现的python,您可以使用java)和swing。Swing有自己的工作线程,如果您进行gui更新,您可以将代码包装成可运行的,并使用
Swing.invokelater
调用它

您可以看到wx是否有类似的功能,如果您只允许从创建gui的线程中操作gui,请尝试类似的功能。为gui创建一个代理对象,它将所有调用转发给线程,线程将调用转发给gui


但是像这样代理会变得一团糟。让他们用“updateGui”函数定义类,这些类应该通过队列返回给您,您将在gui线程中执行。我不太了解wx,我使用jython(用java实现的python,您可以使用java)和swing。Swing有自己的工作线程,如果您进行gui更新,您可以将代码包装成可运行的,并使用
Swing.invokelater
调用它

您可以看到wx是否有类似的功能,如果您只允许从创建gui的线程中操作gui,请尝试类似的功能。为gui创建一个代理对象,它将所有调用转发给线程,线程将调用转发给gui

但是像这样代理会变得一团糟。让他们使用“updateGui”函数定义类,然后通过队列返回给您,您将在gui线程中执行这些类。您能简单地用它运行“python.exe”并导入脚本吗

或者,如果您想将一些(可pickle)数据移动到运行脚本的新进程,那么包应该足够了。只需创建一个运行脚本的函数/可调用函数,并创建一个以该可调用函数为目标的对象。这样,您应该能够传递一些数据,而不会出现GUI问题

用这两种方法捕获文本都很容易,子流程只允许这样做。具有多重