我正在尝试在生成的子进程中运行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()
答案 0 :(得分:0)
我遇到过类似的问题,
我选择重新安排我的代码,以便数据收集和分析正在进行中。
这是,我有一个非常简单的Gui线程和密谋线程。如果gui由于某种原因停滞不前,我仍然可以“及时”采样我的数据
我不喜欢短语
这样我可以在意外崩溃的情况下重启GUI
基本上,如果您的gui崩溃,您应该解决问题,而不是解决方法。