Python 为什么我不能在派生的子进程中运行PySide GUI?

Python 为什么我不能在派生的子进程中运行PySide GUI?,python,multiprocessing,pyside,Python,Multiprocessing,Pyside,我正试图在派生的子进程中运行PySide GUI,但它一直使用exitcode 11(segfault)退出。如果直接调用run_gui,此简化测试代码可以正常工作,但如果在子进程内运行,则会失败: # std lib imports import time import sys from multiprocessing import Process # third party imports from PySide.QtGui import QApplication, QMainWindow

我正试图在派生的子进程中运行PySide GUI,但它一直使用exitcode 11(segfault)退出。如果直接调用run_gui,此简化测试代码可以正常工作,但如果在子进程内运行,则会失败:

# std lib imports
import time
import sys
from multiprocessing import Process

# third party imports
from PySide.QtGui import QApplication, QMainWindow


def run_gui():
    app = QApplication([])
    w = QMainWindow()
    w.show()
    w.raise_()
    sys.exit(app.exec_())


def main():
    gui_proc = Process(target=run_gui)
    #gui_proc.daemon = True # this doesn't seem to matter
    gui_proc.start()
    while True:
        if not gui_proc.is_alive():
            if gui_proc.exitcode != 0:
                print 'GUI exited with code {}'.format(gui_proc.exitcode)
            else:
                print 'GUI exited cleanly.'
            break
        time.sleep(1)

if __name__ == "__main__":
    ## GUI in main process:
    #run_gui()
    ## GUI in child process:
    main()
有办法解决这个问题吗?我不确定如何调试导致SEG故障的原因

我之所以对这样做感兴趣,是因为如果GUI意外崩溃,我可以重新启动它,同时保持两个守护进程运行(一个用于磁盘访问,另一个用于与仪器交互)

编辑:我刚刚使用QCoreApplication尝试了另一个测试脚本(如下),但没有GUI,我看到了同样的问题。显然PySide不会在子进程中运行

# std lib imports
import time
import sys
from multiprocessing import Process

# third party imports
from PySide.QtCore import QCoreApplication, QTimer

def quit():
    print "Quiting..."
    sys.exit()

def run():
    app = QCoreApplication([])
    timer = QTimer()
    timer.timeout.connect(quit)
    timer.start(1000)
    print "Starting..."
    sys.exit(app.exec_())

def main():
    proc = Process(target=run)
    #proc.daemon = True # this doesn't seem to matter
    proc.start()
    while True:
        if not proc.is_alive():
            print 'Process exited with code {}'.format(proc.exitcode)
            break
        time.sleep(1)

if __name__ == "__main__":
    ## GUI in main process:
    #run()
    ## GUI in child process:
    main()

我也有过类似的问题

我选择重新排列我的代码,这样数据收集和分析就可以在这个过程中运行了

这是,我得到了一个非常简单的Gui线程和绘图线程。如果gui由于某种原因停止运行,我仍然能够“及时”采样数据

我不喜欢这个短语

因此,如果GUI意外崩溃,我可以重新启动它


基本上,如果您的gui崩溃,您应该修复问题,而不是采取变通办法。

您使用的平台是什么,您使用的PySide和Qt的版本是什么?我在Linux(PySide 1.2.1,Qt 4.8.5)和WinXP(PySide 1.1.1,Qt 4.7.4)中运行了第二个测试,它运行良好(即它以代码0退出)。很有趣。我在Mac OS X 10.9.1上使用Python2.7.3 64位和PySide 1.1.1。第一个测试也可以,还是第二个测试也可以?但是PySide和Qt的版本是什么?你在使用Linux、Windows和OSX吗?想必,这个例子对我有效,但对你无效,一定有一些系统相关的原因。你能用PyQt试试这个例子吗?这两个例子在Linux和WinXP上都适用。如果您可以使用PyQt在OSX上进行测试,这将非常有用,因为如果emaples有效,这将有助于缩小范围。我想另一种可能是尝试升级到PySide-1.2.x。在单独的进程中运行GUI真的是最好的选择吗?这样调试似乎很痛苦。为什么不使用陷阱捕获未处理的错误,并将其与以下内容结合使用?这应该提供足够的控制,以便能够在同一进程内进行清理和重新启动。我已经在子进程中进行了数据收集,但我希望将GUI也放在子进程中。由于全局解释器锁,线程不足。我很想编写一个没有bug的GUI,但我正在做最坏的打算,并通过将数据收集与表示分离来设计能够容忍bug的应用程序。我可以完全解耦这两个进程,而不是使用子进程,但是我需要重新实现multiprocessing.Pipe提供的特性,这是非常重要的。