为什么我无法在生成的子进程中运行PySide GUI?

时间:2013-12-22 01:12:17

标签: 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


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()

有解决方法吗?我不知道如何调试导致段错误的原因。

我感兴趣的原因是,如果它意外崩溃,我可以重新启动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()

1 个答案:

答案 0 :(得分:0)

我遇到过类似的问题,

我选择重新安排我的代码,以便数据收集和分析正在进行中。

这是,我有一个非常简单的Gui线程和密谋线程。如果gui由于某种原因停滞不前,我仍然可以“及时”采样我的数据

我不喜欢短语

  

这样我可以在意外崩溃的情况下重启GUI

基本上,如果您的gui崩溃,您应该解决问题,而不是解决方法。