Python 使用Qt的多处理在windows中工作,但在linux中不工作

Python 使用Qt的多处理在windows中工作,但在linux中不工作,python,linux,pyqt,python-multiprocessing,Python,Linux,Pyqt,Python Multiprocessing,我使用Qt开发GUI应用程序 尝试使用多处理创建另一个QApplication时出错: RuntimeError:QApplication实例已存在 我有一个主窗口,其中包含一个用于生成新进程的按钮,以便我可以创建一个新的GUI实例。基本上是这样的: from PySide.QtCore import * from PySide.QtGui import * import multiprocessing import sys class MainWindow(QMainWindow):

我使用Qt开发GUI应用程序

尝试使用
多处理创建另一个
QApplication
时出错:

RuntimeError:QApplication实例已存在

我有一个主窗口,其中包含一个用于生成新进程的按钮,以便我可以创建一个新的GUI实例。基本上是这样的:

from PySide.QtCore import *
from PySide.QtGui import *
import multiprocessing
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        btn = QPushButton('run new instance')
        btn.clicked.connect(self.create_daemon)
        self.setCentralWidget(btn)

    def create_daemon(self):
        p = multiprocessing.Process(target=new_window)
        p.start()

def new_window():
    app=QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())

if __name__=="__main__":
    app=QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())
它在Windows中工作,但在Linux中会出现
运行时错误

这是因为Windows和Linux的多处理机制不同吗?在Linux中如何实现同样的功能?

也许这有助于您:

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import multiprocessing
import sys


class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        btn = QPushButton('run new instance')
        self.windows = []
        btn.clicked.connect(self.create_window)
        self.setCentralWidget(btn)

    def create_window(self):
        self.windows.append(ChildWindow())

class ChildWindow(QMainWindow):
    def __init__(self, parent=None):
        super(ChildWindow, self).__init__(parent)
        self.show()

if __name__=="__main__":
    app=QApplication(sys.argv)
    ex = MainWindow()
    ex.show()
    sys.exit(app.exec_())
我使用pyqt4是因为我不想为此安装pyside。我认为在跨平台的qt库中存在一些差异,因此linux应用程序只允许qapplication的一个实例


=>“PySide只支持创建QApplication的单个持久实例。这个单一实例永远存在,不能删除。”

我在谷歌搜索了一下python多处理后发现

关键是,取决于平台
多处理
支持启动新流程的不同方式。这是一个很好的解释。 因此,多处理在Windows中使用
spawn
作为默认方法,而在Linux中使用
fork
作为默认方法。区别在于:

繁殖:

父进程启动一个新的python解释器进程。子进程将只继承运行进程对象
run()
方法所需的资源。特别是,不会继承父进程中不必要的文件描述符和句柄

叉子:

父进程使用
os.fork()
来派生Python解释器。子进程在开始时实际上与父进程相同。父进程的所有资源都由子进程继承

因此,我得出了一个简单的解决方案:

添加
多处理。设置\u开始\u方法('spawn')
下面的
如果\uuuuu名称\uuuuuuu==“\uuuuuu主\uuuuuuu”:


set\u start\u method()
在3.4版中是新的。很高兴有这个更新!我不确定如何在以前的版本中设置此参数。有人知道吗?

到底是什么错误吗?@PeterWood Linux中的错误:
RuntimeError:QApplication实例已经存在。
这意味着Linux没有创建与windows相同的进程。在Linux中创建的新进程可以检测到在我的主进程中运行的QApplication。你在Linux上使用ipython吗?@Tweek Nope,但我很想知道这是如何实现的affect@NorthCat那以后呢,有用吗?在app=QApplication(sys.argv)之后,您可以使用app.aboutToQuit.connect(app.deleteLater)